1、Spring注入
Spring注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为。
常用的两种注入方式:
通过成员变量的set方法进行注入。
<!-- Spring IOC注入方式: 设值注入 -->
<bean id="injectionService" class="com.service.InjectionServiceImpl">
<property name="injectionDAO" ref="injectDAO"></property>
</bean>
<bean id="injectDAO" class="com.dao.InjectionDAOImpl"></bean>
2、构造注入:通过对类构造方法的进行注入。
<!-- Spring IOC注入方式: 构造注入 -->
<bean id="injectionService" class="com.service.InjectionServiceImpl">
<constructor-arg name="injectionDAO" ref="injectDAO"></constructor-arg>
</bean>
<bean id="injectDAO" class="com.dao.InjectionDAOImpl"></bean>
2、Spring Bean装配
2.1、Bean配置项
Bean配置项包括:
1、Id:IOC容器中,Bean的唯一标识。
2、Class:具体要实例化的Class类。
3、Scope:Bean的作用域。
1. singleton:单例,一个Bean容器中只存在一种。如果JVM容器中有多个IOC容器,那么就有singleton,那么就有多个单例。
2. prototype:每次请求(每次使用)都会创建一个新的实例,destory方式不生效。
3. request:每次http请求创建一个实例且仅在当前request内有效。
4. session:每次http请求创建一个实例,且在当前session内有效。
5. global session:基于portlet的web中有效(prolet定义了global session),如果在web中,同session。
4、Constructor arguments:构造器参数。
5、Properties:Bean的属性。
6、Autowiring mode:Bean自动装配模式。
7、Lazy-initialization mode:懒加载模式。
8、Initialization/destruction method:Bean初始化及销毁方法。
2.2 Bean的生命周期
Bean的初始化:
1、初始化
通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
public class ExampleInitializingBean implements InitializingBean{
@Override
public void afterPropertiesSet() throws Exception {
}
}
2. 通过 <bean> 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;
<bean class="InitSequenceBean" init-method="initMethod" destroy-method="destoryMethod"></bean>
3. 在指定方法上加上@PostConstruct 或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。
三种初始化的顺序是:
Constructor > @PostConstruct > InitializingBean > init-method
2.3 Bean的Aware接口
1、Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化后,可以获取相应的资源。如ApplicationContextAware和BeanNameAware等。
2、通过Aware接口,可以对Spring相应资源进行操作(要慎重)。
3、为对Spring进行简单的扩展提供了方便的入口。
2.4 Bean的自动装配(Autowiring)
1、No:不做任何操作。
2、byname:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。
3、byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型的Bean,那么将抛出异常,并指出不能用byType方式进行自动装配;如果没有找到相匹配的bean,则什么都不发生。
4、Constructor:与byType方式相似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的bean,那么将抛出异常。
2.5 Bean的resource
针对资源文件的统一接口,包括:
1、UrlResource:URL对应的资源,根据一个URL地址即可创建。
2、ClassPathResource:获取类路径下的资源文件。
3、FileSystemResource:获取文件系统里面的资源。
4、ServletContextResource:ServletContext封装的资源,用于访问ServletContext环境下的资源。
5、InputStreamResource:针对于输入流封装的资源。
6、ByteArrayResource:针对于字节数组封装的资源。
如果没有URL,也没有路径等,则会依据applicationContext的路径查找文件。
2.6 Bean管理的注解实现
从Spring3.0开始,Spring JavaConfig项目提供了很多特性,包括使用java而不是XML定义bean,比如@Configuration,@Bean,@Import,@DependsOn,@Component,@Respository,@Service,@Controller等。
@Component是一个通用注解,可用于任何Bean。
@Respository通常用于注解DAO类,即持久层。
@Service通常用于注解Service类,即服务层。
@Controller通常用于Controller类,即控制成(MVC)。
<context:component-scan>。如下,将base-package下的所有类都自动注册到applicationContext:
<context:component-scan base-package="com.mss " >
Spring还可以通过使用过滤器自定义扫描,
不包括在这些文件中标注有 @Service,如:
<context:component-scan base-package="com.yiibai.customer" >
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Service" />
</context:component-scan>
或
不包括那些包含DAO这个词组文件名,如:
<context:component-scan base-package="com.yiibai" >
<context:exclude-filter type="regex"
expression="com.yiibai.customer.dao.*DAO.*" />
</context:component-scan>
通常情况下会自动查找的Spring组件,其scope是singleton。若注解@Scope未定义是singleton或prototype等,默认为singleton。
Spring容器可以管理singleton作用域下Bean的生命周期,在此作用域下,Spring能够精确地知道Bean何时被创建,何时初始化完成,以及何时被销毁。而对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean的实例后,Bean的实例就交给了客户端的代码管理,Spring容器将不再跟踪其生命周期,并且不会管理那些被配置成prototype作用域的Bean的生命周期。Spring中Bean的生命周期的执行是一个很复杂的过程,读者可以利用Spring提供的方法来定制Bean的创建过程。Spring容器在保证一个bean实例能够使用之前会做很多工作:
2.8 Autowired注解
@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。
@Autowired是由Spring BeanPostProcessor处理的,所以不能在自己的BeanPostProcessor或BeanFactoryPostProcessor类型应用这些注解,这些类型必须通过XML或者Spring的@Bean注解加载。
list和map使用@Autowired注解时,会自动将类的多个实例都注解进去。list可以通过@Order实现数组的排序,但map不能排序(因为map是key键值对)。
2.9 @Qualifier注解
按类型自动装配可能多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围(或指定唯一),也可以用于指定单独的构造器参数或方法参数。也可用于注解集合类型变量。
2.10 基于java的容器注解
@Bean标识一个用于配置和初始化一个由SpringIOC容器管理的新对象的方法,类似于XML配置文件的<bean/>。
可以在Spring的@Component注解的类中使用@Bean注解任何方法(仅仅是可以)。通常使用的是@Configuration。