-
设值注入
设置注入的本质是通过调用setter方法注入属性值。
-
构造注入
构造注入的本质是通过调用有参数构造函数注入属性值。
- 示例代码结构如下:
- 其中beans.xml的代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- dog => new org.crazyit.app.Dog(2); -->
<bean id="dog" class="org.crazyit.app.Dog">
<constructor-arg value="2"/>
<property name="name" value="旺财"/>
</bean>
</beans>
- Dog类的代码如下:
package org.crazyit.app;
public class Dog
{
private String name;
private int age;
public Dog(int age)
{
super();
System.out.println("--一个参数的构造器--");
this.age = age;
}
public void setName(String name)
{
System.out.println("--setName--");
this.name = name;
}
@Override
public String toString()
{
return "Dog [name=" + name + ", age=" + age + "]";
}
}
- SpringText类的代码如下:
package lee;
import org.crazyit.app.Dog;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest
{
public static void main(String[] args)
{
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
Dog dog = ctx.getBean("dog",Dog.class);
}
}
- 运行SpringTest类的结果如下:
观察上述运行结果发现Spring的设置注入其实就是通过调用setter方法注入属性值,构造注入就是是通过调用有参数构造函数注入属性值。
总结
★ 设置注入的优点:
- 与传统开发更接近,依赖关系更直观。
- 可以延迟注入的时间,并按需注入。不必要实例化所有的依赖Bean
- 在有些参数可选的时候,设值注入显得更灵活。想设置值,就为之配置property元素,否则就不配置。
★ 构造器注入的优点:
- 可以在构造器中决定依赖关系的注入顺序。
- 不提供setter方法,可以避免后续的代码对原有bean的破坏。
- 只有组件的创建者可以实现依赖关系,更符合高内聚的原则
- 实际开发中建议以设值注入为主,构造注入辅助