1.FactoryBean
-
简介
FactoryBean是Spring提供的一种整合第三方框架的常用机制。和普通的bean不同,配置一个 FactoryBean类型的bean,在获取bean的时候得到的并不是class属性中配置的这个类的对象,而是 getObject()方法的返回值。
通过这种机制,Spring可以帮我们把复杂组件创建的详细过程和繁琐细节都 屏蔽起来,只把最简洁的使用界面展示给我们。 将来我们整合Mybatis时,Spring就是通过FactoryBean机制来帮我们创建SqlSessionFactory对象的。
1.创建类UserFactoryBean
/*
getObject():通过一个对象交给IOC容器管理
getObjectType():设置所提供对象的类型
isSingleton:所提供的对象是否单例
当我们把FactoryBean的实现类配置为bean时,会将当前类中getObject()返回的对象交给IOC容器管理
*/
public class UserFactoryBean implements FactoryBean<User> {
@Override
public User getObject() throws Exception {
return new User();
}
@Override
public Class<?> getObjectType() {
return User.class;
}
}
2.配置bean
<bean id="user" class="com.atguigu.bean.UserFactoryBean"></bean>
3.测试
@Test
public void testUserFactoryBean(){
//获取IOC容器
ApplicationContext ac = new ClassPathXmlApplicationContext("springfactorybean.xml");
User user = (User) ac.getBean("user");
System.out.println(user);
}
2.基于XML的自动装配
- 自动装配:根据指定的策略,在IOC容器中匹配某一个bean,自动为bean中所依赖的类类型或接口类型属性赋值。
- 自动装配策略:
- no、default:表示不装配,即bean中的属性不会自动匹配某个bean为属性赋值,此山是属性使用的默认值。
- byType:根据要复制的属性的类型,在IOC容器中匹配某个bean,为属性赋值。
- 注意:
- 若通过类型没有找到任何一个类型匹配的bean,此时不装配,属性使用默认值。
- 若通过类型找到了多个类型匹配的bean,此时会抛出异常:NoUniqueBeanDefinitionException。
- 总结:当使用byType实现自动装配时,IOC容器中有且只有一个类型匹配的bean能够为属性赋值。
- 注意:
- byName:将要赋值的属性的属性名作为bean的id在IOC容器中匹配某个bean,为属性赋值。
- 总结:当类型匹配的bean有多个时,此时可以使用byName实现自动装配。
1.场景模拟
创建类UserController
public class UserController {
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public void saveUser(){
userService.saveUser();
}
}
创建接口UserService
public interface UserService {
void saveUser();
}
创建类UserserviceImpl实现接口UserService
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void saveUser(){
userDao.saveUser();
}
}
创建接口UserDao
public interface UserDao {
void saveUser();
}
创建类UserDaoImpl实现接口UserDao
public class UserDaoImpl implements UserDao {
@Override
public void saveUser() {
System.out.println("添加成功!");
}
}