Spring IOC和DI中及其注解详解

一.IOC和DI
  1.IoC:指将对象的创建权,反转给了Spring容器; 
     不是什么技术,而是一种设计思想,好比于MVC。就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。
     正控:若调用者需要使用某个对象,其自身就得负责该对象的创建。
     反控:调用者只管负责从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给                 Spring框架。
 2.DI:Dependency Injection(依赖注入):
     指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。
     IoC和DI其实是同一个概念的不同角度描述,DI相对IoC而言,明确描述了“被注入对象依赖IoC容器配置依赖对象”。
 3.Container:容器,在生活中容器就是一种盛放东西的器皿,从程序设计角度看作是装对象的对象,
     因为存在对对象的存入、取出等操作,所以容器还要管理对象的生命周期。
  
二. DI注入方式
  1.对象注入(setter和构造器注入)
    手动装配(XML bean方式)
    自动装配(注解方式).
  2.属性注入
    使用bean元素的子元素设置;
        简单类型值,直接使用value赋值;
        引用类型,使用ref赋值;
        集合类型,直接使用对应的集合类型元素即可。
    spring通过属性的setter方法注入值;
    在配置文件中配置的值都是string,spring可以自动的完成类型的转换
    属性的设置值是在init方法执行之前完成的




    
        
        
        
        

    
    
    
        
            
               set1
               set2
               set3
            
        
        
            
               list1
               list2
               list3
            
        
        
           
               arr1
               arr2
               arr3
           
        
        
            
                
                
                
            
        
        
            
                v1 
                v2
                v3
            
        
        
    
    
@Setter
@Getter
public class Employee {
    private Long id;
    private String name;
    private Integer age;
    private String address;

}
@Setter
@Getter
public class CollectionBean {
    private Set set;
    private List list;
    private String[] array;
    private Map map;
    private Properties pro;

}

三.Spring提供的装配标签:
Autowired和Qualifier标签:
1.通过@Autowired标签可以让Spring自动的把属性需要的对象从Spring容器找出来,并注入给该属性。
2.第三方程序:Spring3.0之前,需要手动配置@Autowired解析注解程序,Spring就会自动的加入针对@Autowired标签的解析程序。
      从Spring3.0开始,可以不再需要改配置了。如果不在Spring的测试环境中,也找到@Autowired的解析代码,此时页必须配置.
   
3.@Autowired标签贴在字段或者setter方法上。
4.@Autowired可以同时为一个属性注入多个对象。
      public void setXxx(OtherBean1 other1,OtherBean2 other2) {}
5.使用@Autowired标签可以注入Spring内置的重要对象,比如BeanFactory,ApplicationContext。
  6.测试类:
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration
    public class SpringTest {
        @Autowired
        private ApplicationContext ctx;
    }
6.默认情况下@Autowired标签必须要能找到对应的对象。可使用required=false来避免该问题:@Autowired(required=false)
7.@Autowired找bean的方式:
    1)、首先按照依赖对象的类型找,如果找到则使用setter方法或者字段直接注入;
    2)、如果在Spring上下文中找到多个匹配的类型,再按照名字去找,如果没有匹配则报错;
    3)、可以通过使用@Qualifier("otherBean")标签来规定依赖对象按照bean的id+类型去找;
四.JavaEE提供的装配标签:
  @Resource标签:
  1.@Resource标签是JavaEE规范的标签;也可以作用于字段或者setter方法;必须要求有匹配的对象;
  5.既引入了@Autowired标签的解析器,也引入了@Resource的解析器;
  2.@Resource标签找bean的方式:
    1),首先按照名字去找,如果找到,就使用setter或者字段注入;
    2),如果按照名字找不到,再按照类型去找,但如果找到多个匹配类型,报错;
    3),可以直接使用name属性指定bean的名称;但是,如果指定的name,就只能按照name去找,如果找不到,就不会再按照类型去找;
    
五.使用标签简化IoC:

1.使用标签来完成IoC,就必须有IoC标签的解析器:
    使用context:component-scan来扫描spring需要管理的bean
    base-package就告诉spring,去哪些包及其子包里去扫描bean,如果有多个包需要被扫描;只需要用逗号隔开多个包即可
    
2.标注Bean的注解:@Component
  默认情况,直接使用类的名字(首字母小写作为bean的名字)
  如果要修改bean的名称;直接使用value属性来重新定义bean的名称
  @Component("otherbean")
3.使用@Component的限制:
  1),不能运用到静态工厂方法和实例工厂方法,但是可以使用到FactoryBean;
  2),对于没有源代码的类(框架内部的预定义类),只能用XML配置;
4.bean组件版型标签
  bean组件版型:
  @Service用于标注业务层组件、
  @Controller用于标注控制层组件(如struts中的action)、
  @Repository用于标注数据访问组件,即DAO组件。
  @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
5.指定bean的作用域:@Scope("prototype")
6.初始化和销毁方法
  @PostConstruct
  public void init() {
  相当于
  @PreDestroy
  public void destory() {
  相当于
7.选用xml还是注解:
  1),Annotation:使用方便,XML文件很小,但是,依赖关系又重新回到了代码当中;
  2),XML:使用稍微复杂,但是,代码很干净,代码不会很任何框架产生关系;XML安全;

你可能感兴趣的:(Spring)