Spring总结(一)

Spring

1.1 IOC

IOC 控制反转——依赖注入【都是变主动为被动,调用者只需被动接受Spring容器为调用者的成员变量赋值即可】
Spring配置文件
1.任何对象对Spring来说都是bean,只要是Java类即可。
2.为什么需要对象有无参构造器?
以cn.wcl.test.Person类为例,看Spring配置文件,XXXX.xml (采用配置文件注册):

<bean id = “person”class = “cn.wcl.test.Person”>
    <property name = “sschool” ref = “school”/>
<bean/>

实际上在Spring框架中是以反射方式来调用该类的无参构造器的。具体解析过程如下:

String idStr = “person”; //解析<bean…./>元素的id属性得到字符串值
String classStr = “cn.wcl.test.Person”; //解析class属性
Class clazz = Class.forName(classStr);
Object object = clazz.newInstance(); //调用无参构造器
container.put(idStr, obj); //container代表Spring容器,以id为key放入容器

上面注册文件中<property…/>子元素驱动Spring在底层反射执行一次setter方法,name指定执行哪个setter,value或ref指定传入的参数。【基本数据类型及其包装类、String类用value,容器中其他bean传入参数,用ref。
<peoperty…/>标签底层Java代码大致为:

String nameStr = …; //school
String refStr = …; //school
String setterName = “set”+ nameStr.substring(0,1).toUpperCase() + nameStr.substring(1);
//获取容器中名为refStr的bean,该bean会作为参数传入
Object paramBean = containter.get(refStr);
//clazz是之前反射得到的Person类的Class对象,获取它的setter方法
Method setter = clazz.getMethod(setterName, paramBean.getClass());
//代理执行setter方法
setter.invoke(obj,paramBean);

上述setter注入方式为设值注入,依赖不靠构造函数注入,而是在构造完成后通过setter注入bean。
另一种注入方式为构造注入。不设setter方法,直接写带参构造器注入school。在Spring配置文件中,就不需要<property…/>,而是需要<constructor-arg…/>。例如:

<bean id = “Student” class = “cn.wcl.test.Student”>
    <constructor-arg value = “Alice”/>
    <constructor-arg ref = “middleschool”/>
</bean> 
<bean id = “middleschoolclass = “cn.wcl.test.MiddleSchool”/>
相当于调用
Class Student implements Person {
    private String name;
    private School school;
    Person(String name, School school) {
//…带参构造器
}
}
Class MiddleSchool implements School{…}
Class Test {
    public static void main(String args[]){
        //上面的构造注入配置文件相当于下面这句,调用带参构造器
Person person= new Person(“Alice”, new middleSchool());
    }
}

3.设值注入与构造注入对比
设值注入:需要setter方法。更灵活,适合复杂的依赖关系,如果采用构造注入,构造器会非常臃肿,设值注入则可以避免这些问题。如果某些成员变量可选时,设值注入更加方便,多参数的构造器会非常笨重。
构造注入:可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。对于依赖关系无需变化的bean,构造注入更安全,没有setter方法,防止被外部代码破坏。
建议采用设值注入为主,构造注入为辅。

1.2 Spring容器

猜你喜欢

转载自blog.csdn.net/blacktal/article/details/64128158