Spring的Bean配置说明
- 格式:doc
- 大小:59.50 KB
- 文档页数:10
bean的几种装配方式的基本用法Bean的装配方式是Spring框架中用于实现对象依赖注入的一种机制。
Spring提供了多种装配方式,包括XML配置、注解配置和Java代码配置。
下面将分别介绍这几种装配方式的基本用法。
1.XML配置方式XML配置方式是Spring最早的装配方式之一,需要在XML文件中明确描述Bean的定义和依赖关系。
以下是XML配置的基本用法:- 在XML文件中使用`<bean>`元素定义Bean,可以指定Bean的类名、属性值、构造函数参数等。
- 使用`<property>`元素设置Bean的属性值,可以通过`ref`属性引用其他Bean。
- 使用`<constructor-arg>`元素设置Bean的构造函数参数,同样可以通过`ref`属性引用其他Bean。
2.注解配置方式注解配置方式是Spring 2.5引入的一种装配方式。
通过在Bean的类或者方法上添加注解,Spring能够自动完成对象的创建和依赖注入。
以下是注解配置的基本用法:3. Java代码配置方式Java代码配置方式是从Spring 3.0开始引入的,通过编写Java代码来配置Bean和依赖关系。
以下是Java代码配置的基本用法:- 在方法体中可以进行复杂的逻辑处理来创建Bean,并可以通过参数注入其他Bean。
以上是XML配置、注解配置和Java代码配置这三种装配方式的基本用法。
根据实际的需求和项目的规模,可以选择相应的装配方式来完成对象的管理和依赖注入。
在实际开发中,通常会结合使用这三种方式来完实现Bean的装配。
Spring学习日记-Spring的bean配置文件路径问题展开全文在配置beans 的时候,可以使用ContextLoaderListener 或者ContextLoaderServlet搭配名为contextConfigLocation 的Context-Param,也可以在DispatchServlet的 init-param中定义。
但是其中要注意的是,无论如何,当web容器初始化DispatchServlet的时候,都会去找这个它对于的配置文件。
这个配置文件的默认位置和名字为/WEB-INF/servletname-servlet.xml。
所以,即使已经使用了ContextLoaderListener或ContextLoaderServlet,配置文件 /WEB-INF/servletname-servlet.xml仍然是必须的。
有时候我们需要自定义所有的配置文件,比如,我希望把所有的spring相关的配置文件都放在目录/WEB-INF/spring/底下,我还希望用文件名 appContent-servlet来取代 envoy-servlet.xml。
举个例子:我的配置文件web.xml的相关部分如下:<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/config/appContent-servlet.xml/WEB-INF/config/appContent-service.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>envoy</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>2</load-on-startup></servlet>注意,其中的/WEB-INF/config/appContent-servlet.xml其实就是原来默认名为/WEB-INF/envoy-servlet.xml的配置文件。
<beans>Spring配置文件的根元素,包含一个或多个bean元素。
default-autowire属性:默认的bean自动装配模式。
可选5种模式。
no:不使用自动装配。
Bean的引用必须通过ref元素定义。
byName:通过属性名字进行自动装配。
byType:如果BeanFactory中正好有一个同属性类型一样的bean,就自动装配这个属性。
如果有多于一个这样的bean,就抛出一个致命异常,它指出你可能不能对那个bean使用byType 的自动装配。
如果没有匹配的bean,则什么都不会发生,属性不会被设置。
如果这是你不想要的情况(什么都不发生),通过设置dependency-check="objects"属性值来指定在这种情况下应该抛出错误。
constructor:这个同byType类似,不过是应用于构造函数的参数。
如果在BeanFactory中不是恰好有一个bean与构造函数参数相同类型,则一个致命的错误会产生。
autodetect:通过对bean 检查类的内部来选择constructor或byType。
如果找到一个缺省的构造函数,那么就会应用byType。
default-dependency-check属性:默认的依赖检查模式。
可选四种。
none :不进行依赖检查。
没有指定值的bean属性仅仅是没有设值。
Simple:对基本类型和集合(除了合作者外,比如其他的bean,所有东西)进行依赖检查。
Object:对合作者进行依赖检查。
all :对合作者,基本类型和集合都进行依赖检查。
default-lazy-init属性:默认延迟加载。
True 或False 。
<bean>用于告诉Spring容器一个类以及它是如何配置的。
class属性:Java Bean 类名。
id属性:Java Bean在BeanFactory中的唯一标识,代码中通过BeanFactory获取JavaBean 实例时需以此作为索引名称。
bean的几种装配方式的基本用法Bean的几种装配方式的基本用法在Spring框架中,Bean是一个重要的概念,它代表了应用程序中的一个组件。
Bean可以通过不同的装配方式来实现依赖注入,从而实现组件之间的解耦。
本文将介绍几种常见的Bean装配方式及其基本用法。
一、XML配置文件装配1.1 基本概念XML配置文件是Spring框架最早支持的一种Bean装配方式。
通过在XML配置文件中定义Bean的属性和依赖关系,Spring容器可以自动创建和管理这些Bean。
1.2 基本语法在XML配置文件中,使用<bean>标签来定义一个Bean。
其中包含以下属性:- id:指定该Bean在容器中的唯一标识符;- class:指定该Bean对应的Java类;- scope:指定该Bean在容器中的作用域;- property:指定该Bean所依赖的其他Bean。
例如:<bean id="userService" class="erService"><property name="userRepository" ref="userRepository"/> </bean>上述代码定义了一个名为“userService”的Bean,它对应Java类“erService”,并依赖于名为“userRepository”的另一个Bean。
1.3 优缺点分析XML配置文件装配方式具有以下优点:- 配置灵活:可以通过修改XML配置文件来改变应用程序的行为;- 易于理解:XML配置文件的结构清晰,易于理解和维护。
但是,XML配置文件装配方式也存在以下缺点:- 冗长:XML配置文件需要编写大量的重复代码,增加了开发者的工作量;- 容易出错:由于XML配置文件中的内容是静态的,容易出现因修改不及时而导致的错误。
Spring的并发问题——有状态Bean和⽆状态Bean⼀、有状态和⽆状态有状态会话bean :每个⽤户有⾃⼰特有的⼀个实例,在⽤户的⽣存期内,bean保持了⽤户的信息,即“有状态”;⼀旦⽤户灭亡(调⽤结束或实例结束),bean的⽣命期也告结束。
即每个⽤户最初都会得到⼀个初始的bean。
简单来说,有状态就是有数据存储功能。
有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是⾮线程安全的。
⽆状态会话bean :bean⼀旦实例化就被加进会话池中,各个⽤户都可以共⽤。
即使⽤户已经消亡,bean 的⽣命期也不⼀定结束,它可能依然存在于会话池中,供其他⽤户调⽤。
由于没有特定的⽤户,那么也就不能保持某⼀⽤户的状态,所以叫⽆状态bean。
但⽆状态会话bean 并⾮没有状态,如果它有⾃⼰的属性(变量),那么这些变量就会受到所有调⽤它的⽤户的影响,这是在实际应⽤中必须注意的。
简单来说,⽆状态就是⼀次操作,不能保存数据。
⽆状态对象(Stateless Bean),就是没有实例变量的对象 .不能保存数据,是不变类,是线程安全的。
package com.sw;public class TestManagerImpl implements TestManager{private User user; //有⼀个记录信息的实例public void deleteUser(User e) throws Exception {user = e ; //1prepareData(e);}public void prepareData(User e) throws Exception {user = getUserByID(e.getId()); //2.....//使⽤user.getId(); //3..........}}⼀个有状态的bean⼆、解决有状态bean的线程安全问题Spring对bean的配置中有四种配置⽅式,我们只说其中两种:singleton单例模式、prototype原型模式。
spring中bean配置和bean注⼊1 bean与spring容器的关系Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建⽴Bean定义注册表,然后根据注册表加载、实例化Bean,并建⽴Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应⽤程序进⾏调⽤。
1 bean配置bean配置有三种⽅法:基于xml配置Bean使⽤注解定义Bean基于java类提供Bean定义信息1.1 基于xml配置Bean对于基于XML的配置,Spring 2.0以后使⽤Schema的格式,使得不同类型的配置拥有了⾃⼰的命名空间,是配置⽂件更具扩展性。
①默认命名空间:它没有空间名,⽤于Spring Bean的定义;②xsi命名空间:这个命名空间⽤于为每个⽂档中命名空间指定相应的Schema样式⽂件,是标准组织定义的标准命名空间;③aop命名空间:这个命名空间是Spring配置AOP的命名空间,是⽤户⾃定义的命名空间。
命名空间的定义分为两个步骤:第⼀步指定命名空间的名称;第⼆步指定命名空间的Schema⽂档样式⽂件的位置,⽤空格或回车换⾏进⾏分分隔。
1.1.1 Bean基本配置在Spring容器的配置⽂件中定义⼀个简要Bean的配置⽚段如下所⽰:⼀般情况下,Spring IOC容器中的⼀个Bean即对应配置⽂件中的⼀个<bean>,这种镜像对应关系应该容易理解。
其中id为这个Bean的名称,通过容器的getBean("foo")即可获取对应的Bean,在容器中起到定位查找的作⽤,是外部程序和Spring IOC容器进⾏交互的桥梁。
class属性指定了Bean对应的实现类。
下⾯是基于XML的配置⽂件定义了两个简单的Bean:<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd"><bean id="car" name="#car1" class="com.baobaotao.simple.Car"></bean><bean id="boss" class="com.baobaotao.simple.Boss"></bean></beans>1.1.2 依赖注⼊1. 属性注⼊2. 构造函数注⼊3. ⼯⼚⽅式注⼊1.2 使⽤注解定义Bean我们知道,Spring容器成功启动的三⼤要件分别是:Bean定义信息、Bean实现类以及Spring本⾝。
spring配置文件详解Spring是一个轻量级的开源Java框架,它提供了一种简化Java应用开发的方式。
在Spring框架中,配置文件起着非常重要的作用,它用于配置应用程序中的各种组件和对象。
Spring配置文件通常使用XML格式,但也可以使用注解或Java代码进行配置。
在配置文件中,我们可以定义Bean(对象)、依赖关系、AOP(面向切面编程)等等。
下面将详细介绍Spring配置文件的各个部分。
1. 命名空间和约束在Spring配置文件的开头,我们需要声明命名空间和约束。
命名空间用于引入Spring的命名空间,以便我们可以使用Spring提供的各种功能。
约束用于验证配置文件的正确性。
2. Bean定义在Spring配置文件中,我们可以定义多个Bean。
每个Bean都有一个唯一的ID和一个类名或接口名。
我们可以使用构造函数或工厂方法来创建Bean,并指定Bean的属性值。
3. 依赖注入依赖注入是Spring框架的核心特性之一。
通过依赖注入,我们可以将一个Bean的依赖关系委托给Spring容器来管理。
在配置文件中,我们可以使用<property>元素来设置Bean的属性值,也可以使用<constructor-arg>元素来设置构造函数的参数。
4. 别名和引用在配置文件中,我们可以为Bean定义别名,以便在其他地方使用更简洁的名称来引用Bean。
我们还可以使用<ref>元素来引用其他Bean。
5. 集合和数组Spring配置文件还支持定义集合和数组类型的属性。
我们可以使用<list>、<set>、<map>和<props>元素来定义不同类型的集合。
6. 自动装配自动装配是Spring框架的另一个重要特性。
通过自动装配,Spring容器可以根据Bean之间的依赖关系自动将它们连接起来。
在配置文件中,我们可以使用autowire属性来指定自动装配的方式。
Spring系列:xml中bean定义详解(-)======================================================================================================================================================== bean概念回顾我们再来回顾⼀下,被spring管理的对象统称为bean,我们程序中需要⽤到很多对象,我们将这些对象让spring去帮我们创建和管理,我们可以通过bean xml配置⽂件告诉spring容器需要管理哪些bean,spring帮我们创建和组装好这些bean对象;那么我们如何从spring中获取想要的bean对象呢,我们需要给bean定义⼀个名称,spring内部将这些名称和具体的bean对象进⾏绑定,然后spring容器可以通过这个的名称找对我们需要的对象,这个名称叫做bean的名称,在⼀个spring容器中需要是唯⼀的。
bean xml配置⽂件格式bean xml⽂件⽤于定义spring容器需要管理的bean,常见的格式如下:bean元素⽤来定义⼀个bean对象。
格式<bean id="bean唯⼀标识" name="bean名称" class="完整类型名称" factory-bean="⼯⼚bean名称" factory-method="⼯⼚⽅法"/>bean名称每个bean都有⼀个名称,叫做bean名称,bean名称在⼀个spring容器中必须唯⼀,否则会报错,通过bean名称可以从spring容器获取对应的bean对象。
bean别名先来说⼀下什么是别名?相当于⼈的外号⼀样,⼀个⼈可能有很多外号,当别⼈喊这个⼈的名称或者外号的时候,都可以找到这个⼈。
Spring常⽤的⼀些注解说明@Configuration从Spring3.0,@Configuration⽤于定义配置类,可替换xml配置⽂件,被注解的类内部包含有⼀个或多个被@Bean注解的⽅法。
这些⽅法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进⾏扫描,并⽤于构建bean定义。
@Bean@Bean注解⽤于告诉⽅法,产⽣⼀个Bean对象,然后这个Bean对象交给Spring管理。
产⽣这个Bean对象的⽅法Spring只会调⽤⼀次,随后这个Spring将会将这个Bean对象放在⾃⼰的IOC容器中。
SpringIOC 容器管理⼀个或者多个bean,这些bean都需要在@Configuration注解下进⾏创建,在⼀个⽅法上使⽤@Bean注解就表明这个⽅法需要交给Spring进⾏管理。
@Autowired、@Resource@Resource和@Autowired注解都是⽤来实现依赖注⼊的。
只是@AutoWried按by type⾃动注⼊,⽽@Resource默认按byName⾃动注⼊。
♣ @Autowired@Autowired具有强契约特征,其所标注的属性或参数必须是可装配的。
如果没有Bean可以装配到@Autowired所标注的属性或参数中,⾃动装配就会失败,抛出NoSuchBeanDefinitionException.@Autowired可以对类成员变量、⽅法及构造函数进⾏标注,让 spring 完成 bean ⾃动装配的⼯作。
@Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。
♣ @Resource@Resource是JDK提供的注解,有两个重要属性,分别是name和type。
@Resource依赖注⼊时查找bean的规则既不指定name属性,也不指定type属性,则⾃动按byName⽅式进⾏查找。
<beans> Spring配置文件的根元素,包含一个或多个bean元素。
<bean> 用于告诉Spring容器一个类以及它是如何配置的。
class属性:Java Bean 类名(全路经)。
id属性:Java Bean在BeanFactory中的唯一标识,代码中通过BeanFactory获取JavaBean实例时需以此作为索引名称。
name属性:同上,如果给bean增加别名,可以通过name属性指定一个或多个id。
singleton属性:指定此Java Bean是否采用单例(Singleton)模式,如果设为“true”,则在BeanFactory作用范围内,只维护此Java Bean的一个实例,代码通过BeanFactory获得此Java Bean实例的引用。
反之,如果设为“false”,则通过BeanFactory获取此Java Bean实例时,BeanFactory每次都将创建一个新的实例返回。
abstract属性:设定ApplicationContext是否对bean进行预先的初始化。
parent属性:定义一个模板。
autowire属性:bean自动装配模式。
可选5种模式。
no:不使用自动装配。
Bean的引用必须通过ref元素定义。
byName:通过属性名字进行自动装配。
byType:如果BeanFactory中正好有一个同属性类型一样的bean,就自动装配这个属性。
如果有多于一个这样的bean,就抛出一个致命异常,它指出你可能不能对那个bean使用byType的自动装配。
如果没有匹配的bean,则什么都不会发生,属性不会被设置。
如果这是你不想要的情况(什么都不发生),通过设置dependency-check="objects"属性值来指定在这种情况下应该抛出错误。
constructor:这个同byType类似,不过是应用于构造函数的参数。
如果在BeanFactory中不是恰好有一个bean与构造函数参数相同类型,则一个致命的错误会产生。
autodetect:通过对bean 检查类的内部来选择constructor或byType。
如果找到一个缺省的构造函数,那么就会应用byType。
dependency-check属性:依赖检查模式。
可选四种。
none :不进行依赖检查。
没有指定值的bean属性仅仅是没有设值。
Simple:对基本类型和集合(除了合作者外,比如其他的bean,所有东西)进行依赖检查。
Object:对合作者进行依赖检查。
all :对合作者,基本类型和集合都进行依赖检查。
lazy-init属性:延迟加载。
True 或False 。
init-method属性:初始化方法,此方法将在BeanFactory创建JavaBean实例之后,在向应用层返回引用之前执行。
一般用于一些资源的初始化工作。
destroy-method属性:销毁方法。
此方法将在BeanFactory销毁的时候执行,一般用于资源释放。
factory-bean属性:通过实例工厂方法创建bean,class属性必须为空,factory-bean属性必须指定一个bean的名字,这个bean一定要在当前的bean工厂或者父bean工厂中,并包含工厂方法。
而工厂方法本身通过factory-method属性设置。
factory-method属性:设定工厂类的工厂方法。
depends-on属性:Bean依赖关系。
一般情况下无需设定。
Spring会根据情况组织各个依赖关系的构建工作。
只有某些特殊情况下,如JavaBean中的某些静态变量需要进行初始化(这是一种BadSmell,应该在设计上应该避免)。
通过depends-on指定其依赖关系可保证在此Bean加载之前,首先对depends-on所指定的资源进行加载。
<property> 用于设置一个属性。
name属性:属性的名称。
<value> 指定bean的属性值。
<ref> 指定了属性对BeanFactory中其他Bean的引用关系。
bean=""属性:指定了属性对BeanFactory中其他Bean的引用关系。
local属性:local=""属性: 指定了属性对BeanFactory中其他Bean的引用关系。
(仅在本地(同一个)xml文件里寻找bean。
parent属性:指定了属性对BeanFactory中其他Bean模板的引用关系。
<list> 指定bean的属性类型为List的属性值。
<map> 指定bean的属性类型为List的属性值。
<set> 指定bean的属性类型为List的属性值。
<props> 指定bean的属性类型为Properties的属性值。
<prop>key属性:指定Properties的键<idref> 用来设置属性值为容器中其他bean的id 或name。
<null> 指定一个空值。
<constructor-arg> 使用构造方法注入,指定构造方法的参数。
index属性:设置参数的序号。
ref属性:同reftype属性:参数类型。
value属性:参数的值。
<lookup-method> lookup方法注入bean属性:要注入的bean名name属性:要注入的方法名称<replaced-method> 用来把已存在的方法实现替换为其他的实现。
name属性:要替换的方法名replacer属性:替换者类,实现org.springframework.beans.factory.support.MethodReplacer接口)<arg-type> 方法返回的类型<bean id="exampleBean" class="examples.ExampleBean"><constructor-arg type="int" value="7500000"/><constructor-arg type="ng.String" value="42"/></bean>引用:使用index属性除了可以解决多个简单类型构造参数造成的模棱两可的问题之外,还可以用来解决两个构造参数类型相同造成的麻烦。
注意:index属性值从0开始。
<bean id="exampleBean" class="examples.ExampleBean"><constructor-arg index="0" value="7500000"/><constructor-arg index="1" value="42"/></bean>以上的两种构造器注入一种用的类型,一种用的索引引用其他Bean这里有三种引用的方法,<ref bean="someBean"/><ref local="someBean"/><ref parent="accountService"/>很少使用经过试验证明<ref local="someBean"/> 这种方法只有在当前的Xml文件中才能起到作用,使用引用标记<import resource="teama-applicationContext.xml"/>不能起作用,会抛出异常。
3.3.3.4.1集合合并<beans><bean id="parent" abstract="true" class="plexObject"><property name="adminEmails"><props><propkey="administrator">administrator@</prop><prop key="support">support@</prop></props></property></bean><bean id="child" parent="parent"><property name="adminEmails"><!-- the merge is specified on the *child* collection definition --><props merge="true"><prop key="sales">sales@</prop><prop key="support">support@</prop></props></property></bean><beans>在上面的例子中,child bean的adminEmails属性的<props/>元素上使用了merge=true属性。
当child bean被容器实际解析及实例化时,其adminEmails将与父集合的adminEmails属性进行合并。
最终:administrator=administrator@sales=sales@support=support@3.3.3.4.2. 强类型集合(仅适用于Java5+)public class Foo {private Map<String, Float> accounts;public void setAccounts(Map<String, Float> accounts) {this.accounts = accounts;}}<beans><bean id="foo" class="x.y.Foo"><property name="accounts"><map><entry key="one" value="9.99"/><entry key="two" value="2.75"/><entry key="six" value="3.99"/></map></property></bean></beans>在foobean的accounts属性被注入之前,通过反射,利用强类型Map<String, Float>的泛型信息,Spring的底层类型转换机制将会把各种value元素值转换为Float类型,因此字符串9.99、2.75及3.99就会被转换为实际的Float类型。