FactoryBean和自动装配

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,为属性赋值。
      • 注意:
        1. 若通过类型没有找到任何一个类型匹配的bean,此时不装配,属性使用默认值。
        2. 若通过类型找到了多个类型匹配的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("添加成功!");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值