// 在传统方式中,程序自己控制对象的创建
public class MyApp {
public static void main(String[] args) {
UserService userService = new UserService();
userService.process();
}
}
// 使用IoC容器进行控制反转
public class MyAppWithIoC {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.process();
}
}
使用依赖注入:
// 传统方式,依赖在类内部创建
public class UserService {
private UserDao userDao = new UserDao();
public void process() {
// 使用userDao进行业务逻辑处理
}
}
// 使用依赖注入
public class UserServiceWithDI {
private UserDao userDao;
// 通过构造函数注入依赖
public UserServiceWithDI(UserDao userDao) {
this.userDao = userDao;
}
public void process() {
// 使用userDao进行业务逻辑处理
}
}
public class UserService {
private UserDao userDao;
// 构造函数注入
public UserService(UserDao userDao) {
this.userDao = userDao;
}
// 其他业务方法...
}
在上面的示例中,UserService 类通过构造函数接收一个 UserDao 对象,并将其赋给私有成员变量 userDao。在Spring容器中,你可以配置一个bean,将 UserService 的构造函数参数注入为一个 UserDao 的实例。
public class UserService {
private UserDao userDao;
// 设值注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
// 其他业务方法...
}
在上面的示例中,UserService 类提供了一个 setUserDao 方法,Spring容器会调用这个方法并将一个 UserDao 对象作为参数传递进去。
构造注入: 适用于那些在对象创建时就需要设置的依赖关系。构造注入强调目标类对依赖项的强制性要求,并使得目标类在实例化时就是完全可用的。
设值注入: 适用于那些在对象创建后,需要在运行时动态更改依赖关系的情况。设值注入提供了更灵活的方式,允许在目标类实例化后动态更改依赖项。
在实际使用中,可以根据具体的情况选择使用构造注入或设值注入,甚至两者结合使用。在Spring中,通常推荐使用构造注入来表达目标类对依赖项的强制性要求,同时使用设值注入来注入可选的或在运行时可能发生变化的依赖项。
<bean id="exampleBean" class="com.example.ExampleBean" init-method="init" destroy-method="destroy">
<property name="name" value="John Doe"/>
<bean>
java代码
public class ExampleBean implements InitializingBean, DisposableBean {
private String name;
public void setName(String name) {
this.name = name;
}
// 初始化回调方法
public void init() {
System.out.println("Bean is being initialized...");
}
// 销毁回调方法
public void destroy() {
System.out.println("Bean is being destroyed...");
}
// 其他业务逻辑...
}