Spring装配bean
引
尽管自动装配bean非常简便,但是有些情况下,比如将第三方库中的组件装配到你的应用中的时候,因为你没法为它的类添加@Component注解和@Autowired注解,所以就需要显示装配。
通过Java代码显式装配Bean
现在就假设这些类,前面没有@Component注解,这是一些普通的Java类。
class Wheel {
public void roll(){
System.out.println("Wheels are rolling.");
}
}
class Seat {
public void seat(){
System.out.println("People sitting in the seats.");
}
}
class Engine {
public void start(){
System.out.println("Engine start.");
}
}
interface Transportation {
void run();
void stop();
}
public class Car implements Transportation {
private Wheel wheel;
private Seat seat;
private Engine engine;
public void setWheel(Wheel wheel) {
this.wheel = wheel;
}
public void setSeat(Seat seat) {
this.seat = seat;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
@Override
public void run() {
seat.seat();
engine.start();
wheel.roll();
System.out.println("The car has run.");
}
@Override
public void stop() {
System.out.println("Now, the car has stopped.");
}
}
声明简单的bean
在配置类中声明。
@Configuration
class Config {
@Bean
public Seat seat(){
return new Seat();
}
@Bean
public Wheel wheel(){
return new Wheel();
}
@Bean
public Engine engine(){
return new Engine{
@Override
public void start(){
System.out.println("111");
}
}
}
}
@Bean注解就是表明这个方法将会返回一个bean。你可以在其中做许多事情,非常灵活。
此时beanid就是方法名。
借助JavaConfig实现注入
刚刚只是声明了bean,相当于自动装配时用了一个@Component,但是还有@Autowired,现在解决注入。
有两种方式可以实现注入,一是setter方法注入bean:
还是在Config配置类里面继续写
@Bean
public Car car(){
Car car = new Car();
car.setSeat(seat());
car.setEngine(engine());
car.setWheel(wheel());
return car;
}
@Bean
public Car anotherCar(Wheel wheel, Seat seat, Engine engine){
Car car = new Car();
car.setSeat(seat);
car.setEngine(engine);
car.setWheel(wheel);
return car;
}
类似这样,Car中注入Seat、Engine、Wheel便实现了。
这里有两个bean,分别为Car、AnotherCar,但是都注入了同一个Seat bean,Engine bean,Wheel bean。
默认情况下,Spring中的bean都是单例的,Spring会拦截重复创建相同的实例。所以即使有多个Seat(),返回的也都是相同的bean。
还有一种方式实现注入,构造器注入bean:
就是在class Car中,假如有构造器
public Car(Wheel wheel, Seat seat, Engine engine) {
this.wheel = wheel;
this.seat = seat;
this.engine = engine;
}
那么在配置类中实现注入便可以这样:
@Bean
public Car car(Wheel wheel, Seat seat, Engine engine){
return new Car(wheel, seat, engine);
}
这里的wheel、seat、engine都是bean。
但是仔细想想这俩其实是一个意思。。