目录:
Spring - 实例化Bean
1. 默认使用无参构造器实例化
UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
public UserServiceImpl() {
System.out.println("UserServiceImpl被创建---无参构造器");
}
@Override
public void getUser() {
}
}
输出:
UserServiceImpl被创建---无参构造器
-
有多个构造函数依然会调用无参构造函数
UserServiceImpl.java
@Service public class UserServiceImpl implements UserService { public UserServiceImpl() { System.out.println("UserServiceImpl被创建---无参构造器"); } public UserServiceImpl(UserDao userDao) { System.out.println("UserServiceImpl被创建---有参构造器"); System.out.println(userDao); } @Override public void getUser() { } }
输出:
UserServiceImpl被创建---无参构造器
-
如果只有一个有参构造函数spring会调用,并且把产生自动装配进来
@Service public class UserServiceImpl implements UserService { public UserServiceImpl(UserDao userDao) { System.out.println("UserServiceImpl被创建---有参构造器"); System.out.println(userDao); } @Override public void getUser() { } }
输出:
UserServiceImpl被创建---有参构造器 com.srpinginstantiation.dao.Impl.UserDaoImpl@515c6049
-
如果有参构造函数有多个并且没有无参构造函数,会报错;需要一个无参构造函数
@Service public class UserServiceImpl implements UserService { public UserServiceImpl(UserDao userDao) { System.out.println("UserServiceImpl被创建---有参构造器"); System.out.println(userDao); } public UserServiceImpl(UserDao userDao, UserDao userDao2) { System.out.println("UserServiceImpl被创建---有参构造器"); System.out.println(userDao); System.out.println(userDao2); } @Override public void getUser() { } }
输出:
2. 使用实例工厂方法实例化 - @Bean
-
可以自由的选择构造函数进行实例化
UserServiceImpl.java
public class UserServiceImpl implements UserService { public UserServiceImpl() { System.out.println("UserServiceImpl无参构造"); } public UserServiceImpl(UserDao userDao) { System.out.println("UserServiceImpl有参构造"); System.out.println("userDao:" + userDao); } public UserServiceImpl(UserDao userDao, String name) { System.out.println("UserServiceImpl有参构造"); System.out.println("userDao:" + userDao); System.out.println("name:" + name); } @Override public void getUser() { } }
SpringConfig.java
@Configuration @ComponentScan("com.srpinginstantiation") public class SpringConfig { @Bean public UserService userServiceImpl(UserDao userDao){ UserServiceImpl userServiceImpl = new UserServiceImpl(userDao); System.out.println("实例化:" + userServiceImpl); return userServiceImpl; } }
输出:
UserServiceImpl有参构造 userDao:com.srpinginstantiation.dao.Impl.UserDaoImpl@dd05255 实例化:com.srpinginstantiation.service.Impl.UserServiceImpl@6a78afa0
3. 使用工厂Bean实例化 - FactoryBean
-
FactoryBean是一个接口,需要有一个Bean,实现FactoryBean接口的Bean就成为了特殊的Bean。
-
需实现两个方法:
-
getObject()
===>当通过Bean名称实际获取到的就是getObject()
返回的对象 -
getObjectType()
===> 想通过容器去获取对应的类型,就需要getObject
返回的对象的类型
-
3.1. getObject()
OrderService.java
@Service
public class OrderService implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new UserServiceImpl();
}
@Override
public Class<?> getObjectType() {
return null;
}
}
Main.java
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
Object orderService = context.getBean("orderService");
System.out.println(orderService);
}
}
输出:
UserServiceImpl无参构造
com.srpinginstantiation.service.Impl.UserServiceImpl@3d285d7e
-
在Bean名称开头使用
&
可以返回getObject()
本身的对象Main.java
public class Main { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); Object orderService = context.getBean("&orderService"); System.out.println(orderService); } }
输出:
com.srpinginstantiation.service.Impl.OrderService@26794848
3.2. getObjectType()
OrderService.java
@Service
public class OrderService implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new UserServiceImpl();
}
@Override
public Class<?> getObjectType() {
return UserServiceImpl.class;
}
}
Main.java
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println(context.getBean(UserServiceImpl.class));
}
}