Sping中的配置Bean详解
一、spring实例化对象的方法
在Spring中,所有管理的对象都是JavaBean对象,而BeanFactory和ApplicationContext就是spring框架的两个IOC容器,现在一般使用ApplicationnContext,其不但包含了BeanFactory的作用,同时还进行更多的扩展。
ApplicationContext 的主要实现类:
1、ClassPathXmlApplicationContext:从 类路径下加载配置文件。
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{“spring配置文件路径"});
如果只有一个spring配置文件也可以直接传递一个string参数,不需要使用数组。
2、FileSystemXmlApplicationContext: 从文件系统中加载配置文件。
3、ConfigurableApplicationContext:扩展于 ApplicationContext,新增加两个主要方法:refresh() 和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力。
ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。
WebApplicationContext:是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作。
二、bean的配置规则:
在 xml 文件中通过 bean 节点来配置 bean,基本格式如下:
- <bean id="helloWorld" class="com.kang.spring.HelloWorld">
- <!-- 为属性赋值 -->
- <property name="user" value="kang"></property>
- </bean>
1、id和class属性
id:一个Bean可以通过一个id属性惟一指定和引用,如果spring配置文件中有两个以上相同的id时,spring会报错id冲突。
class:指定这个Bean所关联的类是那个类,需要使用全类名。
2、spring依赖注入3种方式:
对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程,spring的依赖注入有3种方式:
(1).使用构造器注入:(不推荐)
通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性。
- <bean id="……" class="……">
- <constructor-arg>构造函数需要的参数1</constructor-arg>
- <constructor-arg>构造函数需要的参数2</constructor-arg>
- ……
- </bean>
- <bean id="helloWorld" class="com.kang.spring.HelloWorld">
- <constructor-arg>"kang"</constructor-arg>
- <constructor-arg>"1234"</constructor-arg>
- ……
- </bean>
若字面值中包含特殊字符如"<"和">", 则可以使用 DCDATA 来进行赋值。如将参数赋值为<TEST>
<constructor-arg>
<value><![CDATA[<TEST>]]></value>
</constructor-arg>
使用构造器注入方式时:spring在实例化该Bean时会调用配置参数符合的构造方法。前提是在对应的class中提供相应的构造器。
(2).使用属性的setter注入:(推荐)
属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象。属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值。
属性注入是实际应用中最常用的注入方式。
- <bean id="……" class="……">
- <property name="属性1" value="……"/>
- <property name="属性2" value="……"/>
- ……
- </bean>
- <bean id="helloWorld" class="com.kang.spring.HelloWorld">
- <!-- 为属性赋值 -->
- <property name="user" value="kang"></property>
- <property name="password" value="1234"></property>
- </bean>
使用属性的setter注入方式时,所注入的属性必须提供setter和getter方法,spring在实例化时会自动调用无参数的构造方法或者静态工厂方法,实例化之后自动调用属性的set方法将值设置进去。
(3).使用Field字段注入方式:
该方式是spring2.5以后提供的基于java 注解(annotation)方式的注入,就是在java中的字段上或者setter方法上通过使用注解方式进行spring的依赖注入。
例如:
-----字段注入-----
@Resource
private UserDao dao;
-----属性注入-----
@Resource
public void setUserDao(UserDao dao){
this.dao = dao;
}
3、注入依赖bean的方法:
组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能,要使 Bean 能够相互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用。
在 Bean 的配置文件中, 可以通过 <ref> 元素或 ref 属性为 Bean 的属性或构造器参数指定对 Bean 的引用。也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean
简单例子如下:
如果bean2中通过bean1属性引用了bean1则通过下面方式注入:
- <beans>
- <bean id="bean1" class="……">
- <property name="属性1" value="……"/>
- ……
- </bean>
- <bean id="bean2" class="……">
- <property name="bean1" ref="bean1"/>
- ……
- </bean>
- </beans>
4.spring的集合注入:
当需要给Bean的集合引用注入值时,spring也提供了相应的标签。
在标签里包含一些元素. 这些标签可以通过 <value> 指定简单的常量值, 通过 <ref> 指定对其他 Bean 的引用。也可以通过<bean> 指定内置 Bean 定义,通过 <null/> 指定空元素. 甚至可以内嵌其他集合。
(1).Set集合注入:
- <bean id="……" class="……">
- <set>
- <value>value1</value>
- <value>value2</value>
- ……
- </set>
- </bean>
- <bean id="user" class="com.kang.spring.User">
- <property name="userName" value="kang"></property>
- <!-- books在类文件中为一个List表 -->
- <property name="books">
- <!-- 使用 list 元素来装配集合属性 -->
- <list>
- <ref bean="book1"/>
- <ref bean="book2"/>
- <!-- 使用 ref 元素来赋值需要在之前配置好book1和book2的Bean -->
- </list>
- </property>
- </bean>
(2).List集合注入:
数组的定义和 List 一样, 都使用 <list>
<bean id="……" class="……">
<list>
<value>value1</value>
<value>value2</value>
……
</list>
</bean>
(3).Map集合注入:
Java.util.Map 通过 <map> 标签定义, <map> 标签里可以使用多个 <entry> 作为子标签,每个条目包含一个键和一个值。
因为键和值的类型没有限制, 所以可以自由地为它们指定 <value>, <ref>, <bean> 或 <null> 元素。
可以将 Map 的键和值作为 <entry> 的属性定义: 简单常量使用 key 和 value 来定义; Bean 引用通过 key-ref 和 value-ref 属性定义。
<bean id="……" class="……">
<map>
<entry key="key1" value="value1">
<entry key="key2" value="value2">
……
</map>
</bean>
(4).Properties注入:
<bean id="……" class="……">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
……
</props>
</bean>
注意:Spring会自动将其数据类型转换,支持泛型。
三、Spring多个配置文件组合方法
很多时候,由于Spring需要管理和配置的东西比较多,如果都放在一个配置文件中,配置文件会变的比较大,同时不方便与维护,一般好的做法是按照功能模块将Spring配置文件分开,例如:DAO层配置到一个spring-dao.xml配置文件中,Service层配置到spring-service.xml文件中,Struts的action配置到spring-action.xml文件中,然后通过下面两种办法将这些分散的配置文件组合起来:
方法1:推荐
在一个作为Spring总配置文件中的<bean>元素定义之前,通过<import>元素将要引入的spring其他配置文件引入,例如:
<beans>
<import resource="spring-dao.xml"/>
<import resource="spring-service.xml"/>
<import resource="spring-action.xml"/>
……
<bean>
</bean>
……
</beans>
方法2:
----对于JavaSE的工程,当使用下面方法获取ApplicationContext对象时将所有的spring配置文件通过数组传递进去,也可以使用通配符如spring-*.xml方式。
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{“spring配置文件路径"});
----对于JavaEE工程,在web.xml文件中指定spring配置文件时可以指定多个,中间有逗号“,"分隔,也可以使用通配符方式。
四、基于Java注解(Annotation)的方式来配置Bean
Java注解(Annotation)是通过在java源文件上添加标记字段,然后通过反射的反射在编译或者运行时获取这些标记字段以及其标记目标,然后进行相应处理的方法。使用注解可以进行某些配置,大大减少xml配置文件的书写麻烦,但是也有人认为注解方式不方便理解和维护,因此对于注解VS XML配置文件一直争论不断,个人感觉没有好坏之分,根据需求而定。
1、java基本注解
(1)、JDK内置注解:
JDK内置了3个注解:
------ @Override:声明某个方法被重写。
------ @Deprectated:声明某个方法过时,不推荐使用。
------ @SuppressWarning({“unchecked”,…….}):告诉编译器对于那些警告信息忽略。
(2)、自定义java注解:
Java注解就是一种特殊的接口,自定义java注解非常方便,简单例子如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.CLASS)
public @interface TestAnnotation{
String value() default “”;
}
(3)、若要想自定义的注解可以被继承,则需要在自定义注解类上加上“@Inherited”注解。
(4)、注意和说明:
----java的注解实际上是自动继承了java.lang.annotation.Annotation接口,因此在自定义注解时不能继承其他的注解或者接口。
----Retention:告诉编译器如何处理注解,即注解运行在什么时刻。
----RetentionPolicy是个枚举类型,有以下三种状态值:
1).SOURCE:该注解存储在源文件中,编译过后即废弃。
2).CLASS:该注解存储在class文件中,是其缺省的值。
3).RUNTIME:该注解存储在class文件中,并且有Java虚拟机读入解析,该类型非常重要,可以使用反射机制获取注解相关信息,可以进行程序分析处理。
--- @Target:指定注解的目标使用对象。
----ElementType也是个枚举类型,有以下几种状态值:
1).TYPE:该注解适用于class,interface,enum等类级别的目标对象。
2).FIELD:该注解适用于类中字段级别的目标对象。
3).METHOD:该注解适用于类中方法级别的目标对象。
4).PARAMETER:该注解适用于方法参数级别的目标对象。
5).CONSTRUCTOR:该注解适用于类构造方法。
6).LOCAL_VARIABLE:该注解适用于局部变量。
7).ANNOTATION_TYPE:该注解适用于annotation对象。
8).PACKAGE:该注解适用于package对象。
-----注解里面只能声明属性,不能声明方法,声明属性的方式比较特殊:
语法格式为:数据类型 属性() default 默认值(默认值是可选的); 如:String value();
使用时,“注解对象(属性=属性值)”为注解指定属性值,通过“注解对象.属性;”就可以得到注解属性的值。
-----注解的解析:使用java反射机制获得注解的目标对象就可以得到注解对象,如:
通过反射得到了注解目标的Field对象field,则通过“field.getAnnotation(注解类.class);”就可以得到注解对象。
2、基于注解的Spring配置准备条件:
从Spring2.5以后,Spring开始全面支持注解方式配置,所以可以不用写xml配置文件,一样可以使用spring。
(1).使用spring注解方式,必须加入spring注解方式所依赖的jar包:common-annotation.jar。
(2).使用注解方式时,必须在spring配置文件的schema中添加注解的命名空间如下:
xmlns:context=”http://www.springframework.org/schema/context”
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
(3).在spring配置文件中注册注解处理器:
在spring配置文件中<bean>元素之前添加:
<context:annotation-config>
3、基于注解的spring配置:
Spring2.5中使用四个注解按功能来进行对bean的配置:
(1).@Component:泛指组件,对于一般不好归类的java Bean使用。
(2).@Service:用于标注配置业务层(service层)组件。
(3).@Controller:用于标注配置控制层的组件(如Struts中的action)。
(4).@Repository:用于标注配置数据访问层组件,即一般的DAO层Bean对象。
注意:对于使用spring注解方式配置的bean对象,bean引用时默认名称为被注解名称的首字母小写形式,也可以指定名称,如:@Service(“userDao“)。
4、Spring的自动装配:
自动装配的是指不用手动显式配置java Bean之间依赖关系,而是让spring依据某种规则自动将合适的对象注入到目标对象的过程。Spring中常用@Autowire和@Resource来进行自动装配。
(1).@Autowire:默认是按照对象的数据类型进行自动装配的,如
@Autowire
private UserDao userDao;
spring框架在运行时会自动将类型为UserDao的对象注入进来。
(2).@Resource:默认是按照名称或者Id进行自动装配的,只有当找不到匹配的名称或者Id时才按类型进行装配,如:
@Resource(name=”userDao”)
private UsreDao userDao;
spring框架在运行时会将配置名称或者id为“userDao”的对象注入进来。
注意:@Autowire和@Resource都既可以写在字段上,也可以写在set方法上。
5、Spring的自动扫描:
Spring自动扫描机制是指,我们使用基于注解的spring配置方式后,spring的配置文件中只需要注册注解处理器,不用显式地配置Bean,当spring在运行时会自动扫描根据给定的条件下类路径中的所有bean,根据注解将它们注入和装配起来并进行初始化的过程。
自动扫描很简单,只需要在spring的配置文件中添加如:
<context:component-scan base-package=“要自动扫描的包名“>
Spring在运行时就可以对指定的包中所有添加了Spring注解的bean自动扫描,注入,装配和初始化。
注意:基于注解的spring配置,自动装配和自动扫描是紧密联系在一起协同工作的,都需要引入context的命名空间。
五、Bean的作用域
在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域。
默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域。
其取值情况如下:
Sping中的配置Bean详解的更多相关文章
- Spring框架入门之基于xml文件配置bean详解
关于Spring中基于xml文件配置bean的详细总结(spring 4.1.0) 一.Spring中的依赖注入方式介绍 依赖注入有三种方式 属性注入 构造方法注入 工厂方法注入(很少使用,不推荐,本 ...
- Tomcat server.xml中Connector配置参数详解
Tomcat中Connector常用配置 Tomcat中server.xml有些配置信息是需要我们了解的,最起码知道如何进行简单的调试. <Connector port="8080&q ...
- Webpack中SplitChunksPlugin 配置参数详解
代码分割本身和 webpack 没有什么关系,但是由于使用 webpack 可以非常轻松地实现代码分割,所以提到代码分割首先就会想到使用 webopack 实现. 在 webpack 中是使用 Spl ...
- spring在IoC容器中装配Bean详解
1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean ...
- SpringBoot中使用UEditor基本配置(图文详解)
SpringBoot中使用UEditor基本配置(图文详解) 2018年03月12日 10:52:32 BigPotR 阅读数:4497 最近因工作需要,在自己研究百度的富文本编辑器UEditor ...
- Spring二 Bean详解
Bean详解 Spring框架的本质其实是:通过XML配置来驱动Java代码,这样就可以把原本由java代码管理的耦合关系,提取到XML配置文件中管理.这样就实现了系统中各组件的解耦,有利于后期的升级 ...
- Java编程配置思路详解
Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...
- (转)java之Spring(IOC)注解装配Bean详解
java之Spring(IOC)注解装配Bean详解 在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看 ...
- Springboot@Configuration和@Bean详解
Springboot@Configuration和@Bean详解 一.@Configuration @Target({ElementType.TYPE}) @Retention(RetentionPo ...
随机推荐
- idea http请求的插件(测试接口方便)
http://blog.csdn.net/winter_chen001/article/details/77249029
- hdu 3605 /状态合并最大流
题意:N个人去m个星球,给出n个人可以去哪些星球的01矩阵.求是否能满足所有人都去.(n到10万,m<=10) 一看,起先一瞬间就建图,准备秒了,人向星球连边,直接最大流判断是否为n,提交超时. ...
- hdu3572 任务分配/最大流判断满流
题意:将n个任务分配为m个机器,给每个任务需要的天数(无需每天连续),和可以在哪些天去做该任务,求是否存在方案. 典型的任务(X)----天(Y)二分最大流,(因为这里任务是与天的关系)处理器控制流量 ...
- LeetCode OJ--Binary Tree Level Order Traversal II
http://oj.leetcode.com/problems/binary-tree-level-order-traversal-ii/ 树的层序遍历,和上一道题相比,对结果做一个顺序调整 reve ...
- Codeforces Gym101606 E.Education (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))
E Education 这个题有点意思,就是找满足条件的最小价格里的最大值的人数,有点贪心的思想吧,一开始写错了,人群的那个不能排序,而且是最小价格里找能住下人最多的部门,让这个部门去住这个房间.在循 ...
- Codeforces 333E Summer Earnings(bitset)
题目链接 Summer Earnings 类似MST_Kruskal的做法,连边后sort. 然后对于每条边,依次处理下来,当发现存在三角形时即停止.(具体细节见代码) 答案即为发现三角形时当前所在边 ...
- Careercup | Chapter 3
3.1 Describe how you could use a single array to implement three stacks. Flexible Divisions的方案,当某个栈满 ...
- luogu P2066 机器分配
题目背景 无 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M≤15 ...
- Linux环境下编译JDK
环境准备 操作系统,ubuntu-14.04.6-desktop-amd64.iso,下载地址:http://59.80.44.100/releases.ubuntu.com/14.04/ubuntu ...
- Linux下批量替换文件内容和文件名(转)
1.批量替换指定多个文件的文件内容 在指定目录/your/path里,查找包含old_string字符串的所有文件,并用new_string字符串替换old_string字符串. sed -i &qu ...