(1)Spring框架实现实例化的三种方式:
第一种:使用构造器实现Bean的实例化
SpringIOC容器既能使用默认空参构造器也能使用有参数的构造器创建bean
第二种;使用静态工厂方式创建Bean实例化对象
使用这种方式除了指定必须的class属性,还要指定factory-method 属性来指定实例化Bean的方法个,该方法必须是静态方法。而且使用静态工厂方法也允许指定方法参数,spring IoC 容器将调用此属性指定的方法来获取Bean。
第三种:使用实例化工厂的方式创建Bena实例化对象
使用这种方式不能指定class 属性,此时必须使用factory-bean属性来指定工厂Bean的id, factory- method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样。
(2)依赖注入方式:
依赖注入是Spring 协调不同Bean实例之间的合作而提供的一种工作机制,在确保Bean实例之间合作的同时,并能保持每个Bean的相对独立性。
1)基于构造函数注入
构造函数注入就是通过Bean类的构造方法,将Bean 所依赖的对象注入。构造函数的参数一般情况 下就是依赖项,spring 容器会根据bean 中指定的构造函数参数来决定调用那个构造。
2)基于set方法注入
将Bean 所依赖的对象通过设置函数注入,Bean 需要为注入的依赖对象提供设置方法。
3)基于自动装配注入
Spring I0C容器会基于反射查看Bean定义的类。当Spring 容器发现Bean被设置为自动装配的by Type 模式后,它会根据参数类型在Spring 容器中查找与参数类型相同的被依赖Bean对象,如果已经创建,则会把被依赖的对象自动注入到Bean中,如果没有创建,则不会注入。注入过程需要借助Bean 提供的设置方法来完成,否则注入失败。
4)基于注解的依赖注入
Spring主要提供了@Autowired和@Resource注解模式,下面也重点讨论这两种注解模式。
@Autowi red装配顺序
@Autowired默认按类型装配(这个注解是属于spring 的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required 属性为false, 如: @Autowired (required=false),如果我们I想使用名称装配可以结合@Qualifier注解进行使用。
@Resource装配顺序
1.如果同时指定了name和type,则从Spring.上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一 bean进行装配,找不到或者找到多个,都会抛出异常
4.如果既没有指定name,又没有指定type,则自动按照byName.方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配