day123- 自动装配xml

GUGU / 2023-08-05 / 原文

基于xml的自动装配

自动装配

根据指定的策略,在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类型属性赋值

模拟

controller

public class UserController {
    private UserService userService;
​
    public UserService getUserService() {
        return userService;
    }
​
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
​
    public void saveUser(){
        userService.savUser();
    }
}

 

service

public interface UserService {
    void savUser();
}
public class UserServiceImpl implements UserService {
​
    private UserDao userDao;
​
    public UserDao getUserDao() {
        return userDao;
    }
​
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
​
    @Override
    public void savUser() {
        userDao.saveUser();
    }
}

 

dao

public interface UserDao {
    void saveUser();
}
public class UserDaoImpl implements UserDao {
    @Override
    public void saveUser() {
        System.out.println("okokokokok");
    }
}

 

配置bean

使用bean标签的autowire属性设置自动装配效果

  1. 自动装配方式:byType

byType:根据类型匹配IOC容器中的某个兼容类型的bean,为属性自动赋值

若在IOC中,没有任何一个兼容类型的bean能够为属性赋值,则该属性不装配,即值为默认值null

若在IOC中,有多个兼容类型的bean能够为属性赋值,则抛出异常NoUniqueBeanDefinitionException

  1. 自动装配方式:byName

    byName:将自动装配的属性的属性名,作为bean的id在IOC容器中匹配相对应的bean进行赋值

  <bean id="userController" class="com.gu.spring.controller.UserController" autowire="byName">
<!--        <property name="userService" ref="userService"></property>-->
    </bean><bean id="userService" class="com.gu.spring.service.impl.UserServiceImpl" autowire="byType">
<!--        <property name="userDao" ref="userDao"></property>-->
    </bean><bean id="userDao" class="com.gu.spring.dao.impl.UserDaoImpl"></bean>

 

test

@Test
public void testAutowire(){
    ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire-xml.xml");
    UserController userController = ioc.getBean(UserController.class);
    userController.saveUser();

 


}

总结

/**
* 自动装配:
* 根据指定的策略,在ioc容器中匹配某个bean,自动为bean中的类类型属性或者接口类型的属性进行赋值
* 自动装备策略:
* bean标签中的 autowire=""
* 1.no,default:表示不装配,即bean中的属性不会自动匹配某个bean为属性赋值,此时属性使用默认值
* 2. byType: 跟胡要赋值的属性的类型,在ioc容器中匹配某个bean,为属性赋值
* 注意:
*     a> 若通过类型没有找到任何类型匹配的bean,此时的属性不装配,使用的是默认值
*         java.lang.NullPointerException
*     b> 若通过类型找到了多个类型匹配的bean,此时会抛出异常
*         NoUniqueBeanDefinitionException
*     总结:当使用byType实现自动装配时,ioc容器中有且只有一个类型匹配的bean能够为属性赋值
* 3. byName:将要复制的属性的属性名作为bean的id在ioc容器中匹配某个bean,为属性赋值
*     总结:当类型匹配的bean有多个时,此时可以使用byName实现自动装配
*/

over