spring学习(二)配置bean
Spring可以分为6大模块:
-
Spring Core spring的核心功能: IOC容器, 解决对象创建及依赖关系
-
Spring Web Spring对web模块的支持。
-
可以与struts整合,让struts的action创建交给spring
-
spring mvc模式
-
-
Spring DAO Spring 对jdbc操作的支持 【JdbcTemplate模板工具类】
-
Spring ORM spring对orm的支持:
-
既可以与hibernate整合,【session】
-
也可以使用spring的对hibernate操作的封装
-
-
Spring AOP 切面编程
-
SpringEE spring 对javaEE其他模块的支持
Spring Core 配置bean
引入jar包,涉及到Spring core的开发jar包有五个:
-
commons-logging-1.1.3.jar 日志
-
spring-beans-3.2.5.RELEASE.jar bean节点
-
spring-context-3.2.5.RELEASE.jar spring上下文节点
-
spring-core-3.2.5.RELEASE.jar spring核心功能
-
spring-expression-3.2.5.RELEASE.jar spring表达式相关表
Spring核心的配置文件applicationContext.xml
或者叫bean.xml
,通过ClassPathXmlApplicationContext来获取ApplicationContext(IOC容器)
在Spring中可以通过三种方式来配置对象:
-
使用XML文件配置
-
使用注解来配置
-
使用JavaConfig来配置
使用Xml配置bean
-
普通带参数的构造方法
<bean id="user" class="bean.User">
<!--
通过constructor这个节点来指定构造函数的参数类型、名称、第几个(index)
如果构造函数的参数值是一个对象,而不是一个普通类型的值,我们就需要用到ref属性了,而不是value
-->
<constructor-arg name="id" type="java.lang.String" value="1"/>
<constructor-arg name="username" type="java.lang.String" value="tom"/>
</bean>
-
工厂静态方法
<!--工厂静态方法创建对象,直接使用class指向静态类,指定静态方法就行了-->
<bean id="user" class="bean.Factory" factory-method="getBean"/>
-
工厂非静态方法:先创建工厂bean,用工厂bean调用非静态方法
<bean id="factory" class="bean.Factory"/>
<bean id="user" class="bean.User" factory-bean="factory" factory-method="getBean"/>
-
构造方法传入集合
使用注解配置bean
通过注解来配置信息就是为了简化IOC容器的配置,注解可以把对象添加到IOC容器中、处理对象依赖关系
使用注解前提步骤:
-
xml配置文件先引入context名称空间
-
xmlns:context="http://www.springframework.org/schema/context"
-
xsi:schemaLocation添加
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
-
-
开启注解扫描器
-
第一种方法:在xml添加
<context:component-scan base-package="包名"></context:component-scan>
-
第二种方法:通过自定义扫描类以@CompoentScan修饰来扫描IOC容器的bean对象。在使用@ComponentScan()这个注解的时候,在测试类上需要@ContextConfiguration这个注解来加载配置类,@ContextConfiguration这个注解在Spring的test包下
//表明该类是配置类
-
创建对象以及处理对象依赖关系,相关的注解:
-
@ComponentScan扫描器
-
@Configuration表明该类是配置类
-
@Component 指定把一个对象加入IOC容器,把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
-
@Repository 作用同@Component; 在DAO层使用
-
@Service 作用同@Component; 在业务逻辑层使用
-
@Controller 作用同@Component; 在控制层使用
-
@Resource 依赖关系
-
如果@Resource不指定值name,那么就根据类型来找,相同的类型在IOC容器中不能有两个
-
如果@Resource指定了值,那么就根据名字来找
-
测试代码
//把对象添加到容器中,首字母会小写
使用JavaConfig配置bean
由于Spring的自动装配并不能将第三方库组件装配到应用中,于是需要显式装配配置。
通过java代码来配置Bean:
-
编写一个java类,使用@Configuration修饰该类,被@Configuration修饰的类就是配置类
-
在配置类中使用@Bean修饰方法,蒋返回值加入到IOC容器中
-
使用@Bean来修饰方法,该方法返回一个对象。
-
不管方法体内的对象是怎么创建的,Spring可以获取得到对象就行了。
-
Spring内部会将该对象加入到IOC容器中
-
容器中bean的ID默认为方法名
-
-
在测试类使用@ContextConfiguration加载配置类的信息
三种方式混合使用
注解和XML配置是可以混合使用的,JavaConfig和XML也是可以混合使用的…
如果JavaConfig的配置类是分散的,我们一般再创建一个更高级的配置类(root),然后使用@Import来将配置类进行组合 如果XML的配置文件是分散的,我们也是创建一个更高级的配置文件(root),然后将配置文件组合
在JavaConfig引用XML
-
使用@ImportResource()
在XML引用JavaConfig
-
使用<bean>节点就行了
<bean>节点的属性
scope属性
scope的值就只有两个:单例、多例,spring默认是单例
-
当我们使用singleton【单例】的时候,从IOC容器获取的对象都是同一个,默认是单例 【service/dao/工具类】
-
当使用singleton的时候,对象在IOC容器初始化时创建
-
-
当我们使用prototype【多例】的时候,从IOC容器获取的对象都是不同的,【Action对象】
-
当使用prototype的时候,对象在使用的时候才创建
-
lazy-init属性
lazy-init属性只对singleton【单例】的对象有效,lazy-init默认为false
有的时候,可能我们**想要对象在使用的时候才创建,那么将lazy-init设置为ture
init-method和destroy-method
如果我们想要对象在创建后,执行某个方法,我们指定为init-method属性,对应对象的init_user方法
如果我们想要IOC容器销毁后,执行某个方法,我们指定destroy-method属性,在调用容器对象的destroy方法时候执行(容器用实现类)