主要内容

1、装配bean

2、依赖注入

3、bean之间的关系

4、bean的作用域

5、profile

6、bean的属性

 


 

一、装配bean

1、Spring中有三种方式装配Bean:

      1、XML中显式配置

      2、Java中显式配置

      3、隐式的bean发现机制和自动装配

      显式配置与隐式配置:隐式配置采用自动扫描,使开发便捷。但是有些情况下只能使用显式的手动配置。比如引入一些第三方库,要想让Spring管理这个bean。不可能修改它的源码。只能通过显式配置。

 

a、XML中显式配置

在Spring配置文件中使用bean标签去申明bean

<bean id="test" class="com.congrong.Test" />

 

b、Java中显式配置

@Configuration:作用在类上,表明该类是配置类,包含Spring上下文中创建bean的细节。

@Bean:作用在方法上,表明该方法返回的对象要注册为Spring上下文中的bean。

@Configuration

public class SpringBeanConfigTest {

    @Bean

    public Test test() {

         return new Test();

    }

}

 

c、隐式的bean发现机制和自动装配

第一步:启动组件扫描 (Spring自动发现上下文中的bean)

1、Java Config配置:@ComponentScan(com.congrong)

2、XML配置:<context:component-scan base-package="com.congrong" />

被发现的bean用以下注解标记类:

@controller

@service

@repository

@component (指各种组件,不属于MVC层中的类,就使用@Component来标注这个类。)

@Named(Java规范中的,Spring也支持,但是使用较少)

 

第二步:自动装配(Spring自动满足Bean之间的依赖)

1、Spring的:@Autowired

2、Java规范的注解:@Inject、@Resource

其他辅助注解

@Qualifier:指定的匹配名


二、依赖注入

1、属性注入

2、构造函数注入

3、工厂方法注入

4、注解注入

 

1、属性注入

通过setXxx()方法注入Bean的属性值或者依赖对象。

 

2、构造函数注入

通过构造函数注入,该方式好处是保证必要属性在Bean实例化时得到设置。

 

3、工厂方法注入

a、静态工厂的方法注入:

通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取:

public class PeopleFactory {  

    //静态工厂  

    public static final People getPeople(){  

        return new Man();  

    }  

}
public class Test {  

    private People people;  

    public void setPeople(People people) {  

        this.people = people;  

    }  

}
<bean name="Test" class="com.congrong.Test" >  

        <!--使用静态工厂的方法注入对象,对应下面的配置文件-->  

        <property name="people" ref="people"></property>  

</bean>  

<!--获取对象的方式是从工厂类中获取静态方法-->  

<bean name="people" class="com.congrong.ProplrFactory" factory-method="getPeople"></bean>

 

b、实例工厂的方法注入

实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法:

public class PeopleFactory {  

    //实例工厂  

    public static final People getPeople(){  

        return new Man();  

    }  

}

 

<bean name="Test" class="com.congrong.Test" >  

     <!--使用静态工厂的方法注入对象,对应下面的配置文件-->  

     <property name="people" ref="people"></property>  

</bean>  

<!--获取对象的方式是从工厂类中获取静态方法-->  

<bean name="peopleFactory" class="com.congrong.ProplrFactory"></bean>  

<bean name="people" factory-bean="peopleFactory" factory-method="getPeople"></bean>

4、注解注入

@Autowired、@Inject、@Resource


三、bean之间的关系

1、继承

2、依赖

 

1、继承

bean的继承和java的继承是不一样的,不是父类子类。但思想很相似.

a、父bean是一个实例时。它本身是一个完整的bean。

b、父bean是模板,抽象bean,不能被实例化,只是来被继承。abstract="true"

<bean id="test" class="com.congrong.Test" p:name="zsr" p:age="18" abstract="true"></bean>

<bean id="test1" p:sex="man" parent="test"></bean>

<bean id="teste" p:sex="female" parent="test"></bean>

2、依赖

public class Person {

private String name;

private Car car;

}

 

<bean id="person" class="com.congrong.Person" p:name="whc"></bean>

有一个属性Car没有配置,那实例化后,它就是null。但是并不会报错。

 

有时,我们需要让某个属性必须存在,就像必填项一样。 用depends-on 依赖

 

<bean id="person" class="com.cong.Person" p:name="zsr" depends-on="car"></bean>

这样表示,实例化person一定要依赖car,没有配置car会抛异常


四、bean的作用域

singleton

prototype

(以下是web环境下才有)

request

session

global session


五、profile

项目开发过程一般涉及,开发 -> 测试 -> 生产,阶段,每个阶段的环境的配置参数会有不同,如数据源,文件路径等。为避免每次切换环境时都要进行参数配置等繁琐的操作,可以通过spring的profile功能来进行配置参数的切换。

<!-- 开发环境配置文件 -->

<beans profile="dev">

<context:property-placeholder location="classpath*:dev/*.properties" />

</beans>



<!-- 测试环境配置文件 -->

<beans profile="test">

<context:property-placeholder location="classpath*:test/*.properties" />

</beans>

<!-- 生产环境配置文件 -->

<beans profile="prod">

<context:property-placeholder location="classpath*:prod/*.properties" />

</beans>

 

设置spring.profiles.default和spring.profiles.active这两个属性来激活和使用对应的配置文件。

default为默认,如果没有通过active来指定,那么就默认使用default定义的环境。

这两个属性可以通过多种方法来设置:

1、web.xml中作为web应用的上下文参数context-param;

2、web.xml中作为DispatcherServlet的初始化参数;

3、作为JNDI条目;

4、作为环境变量;

5、作为JVM的系统属性;

6、在集成测试类上,使用@ActiveProfiles注解配置。


六、bean的属性

1、id:唯一标识名。

2、name:创建一个或多个别名。

3、class:定义类的全限定名。

4、parent:子类Bean定义它所引用它的父类Bean的id。

5、abstract:默认false,用来定义Bean是否为抽象Bean。

6、scope:作用域,默认singleton,还有prototype、request、session、global session。

7、lazy-init:默认为false,在spring启动时,立刻进行实例化。反之,在第一次请求时才开始创建。

8、autowire:默认no,定义了Bean的自动装配方式。

      a、no:不使用自动装配功能,需要显示的使用bean引用来连接。

      b、byName:通过Bean的属性名实现自动装配。

      c、byType:通过Bean的类型实现自动装配。

      d、constructor:类似于byType,但它是用于构造函数的参数的自动组装。

      e、autodetect:先尝试通过 constructor 使用自动装配来连接,如果它不执行,再尝试通过 byType 来自动装配。

9、dependency-check:默认none,确保依赖关系都满足。

     a、none:不进行依赖检查。

     b、objects:只做对象间依赖的检查。

     c、simple:只做原始类型和String类型依赖的检查

     d、all:对所有类型的依赖进行检查。

10、depends-on:Bean在初始化时,依赖的对象会在Bean初始化之前创建。

11、init-method:定义Bean的初始化方法。

12、destroy-method:定义Bean的销毁方法。

13、factory-method:定义创建该Bean对象的工厂方法。

14、factory-bean:定义创建该Bean对象的工厂类。