Spring注入及Spring Bean的装配

1、Spring注入

      Spring注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为。

       常用的两种注入方式:

              1、设值注入:通过成员变量的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内有效。

扫描二维码关注公众号,回复: 53621 查看本文章

                   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、初始化

                   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)。 

    Spring可以自动检测类并注册Bean到ApplicationContext中,需要<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>

                 2.7 Bean的作用域

      通常情况下会自动查找的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。

猜你喜欢

转载自blog.csdn.net/z20082480143/article/details/80040098