如果在A类中需要用到B类,可以使用更简单的注入方式
Spring中实现依赖注入的三种方式:
属性注入、Setter注入、构造方法注入
属性注入
UserService类
import org.springframework.stereotype.Service;
@Service
public class UserService {
public void sayHi() {
System.out.println("Hi userService");
}
}
Control类
import com.java.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class Control {
@Autowired
private UserService userService;
public void sayHi() {
System.out.println("Contorl -> sayHi");
userService.sayHi();
}
}
执行以下代码
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.java.demo.entity.User;
import com.java.demo.controlloer.Control;
public class App {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
Control control = context.getBean("control", Control.class);
control.sayHi();
}
}
得到的运行结果
我们发现,在Control类中,我们并没有实例化userService,只是在前面加了一个@Autowired,但是可以调用userService的方法,这是因为Spring帮我们实现了对象注入。
属性注入优缺点:
优点:非常简单,只需要添加一个@Autowired即可
缺点:无法注入不可变对象、有违背单一职责原则的风险
Setter注入
import com.java.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class Control {
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
public void sayHi() {
System.out.println("Contorl -> sayHi");
userService.sayHi();
}
}
创建一个方法用来给userService赋值,Spring会自动传入参数
优点:遵循单一职责原则
缺点:无法注入不可变对象
构造方法注入
package com.java.demo.controlloer;
import com.java.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class Control {
private UserService userService;
@Autowired
public Control(UserService userService) {
this.userService = userService;
}
public void sayHi() {
System.out.println("Contorl -> sayHi");
userService.sayHi();
}
}
优点:可注入一个不可变对象、对象不会被修改