以下两个类分别使用配置形式与注解形式加入 IOC 容器中
service.impl.UserInfoService
@Data
@Service
public class UserInfoService implements IUserInfoService {
private UserInfoDao userMapper;
}
dao.impl.UserInfoDaoImpl
@Repository
public class UserInfoDaoImpl implements UserInfoDao {
}
一、配置形式
二、@Configuration 注解形式
1、@ComponentScan
@Configuration
@ComponentScan(value = "service.impl,dao.impl")
public class MyConfig {
}
@Data
@Service
public class UserInfoService implements IUserInfoService {
@Autowired
private UserInfoDao userMapper;
}
@ComponentScan(value = “service.impl,dao.impl”)
扫描指定包中的含有 @Service、@Repository、@Controller、@Component 注解的类
@Autowired
根据变量类型自动装配已经已经加载进 IOC 容器的类
配置形式与注解形式的 IOC 为两个相互独立的 IOC
@ComponentScan 参数说明
1、excludeFilters:符合条件的类不加入 IOC
2、includeFilters :符合条件的类加入 IOC,需配合 useDefaultFilters = false 使用,否则不生效
3、type = FilterType.ANNOTATION:条件为注解类型的,指定@Service、@Repository、@Controller、@Component
4、type = FilterType.ASSIGNABLE_TYPE:条件为具体的类,如:UserInfoDaoImpl.class
@Configuration
@ComponentScan(value = "service.impl,dao.impl",excludeFilters ={@ComponentScan.Filter(type = FilterType.ANNOTATION ,value = Service.class)} )
//@ComponentScan(value = "service.impl,dao.impl",includeFilters ={@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = UserInfoDaoImpl.class)},useDefaultFilters = false )
//@ComponentScan(value = "service.impl,dao.impl",includeFilters ={@ComponentScan.Filter(type = FilterType.CUSTOM ,value = MyCustom.class)},useDefaultFilters = false )
public class MyConfig {
}
5、type = FilterType.CUSTOM:自定义过滤条件,value值为自定义的类,如:MyCustom.class
需实现 TypeFilter 接口
public class MyCustom implements TypeFilter {
public boolean match(metadataReader metadataReader, metadataReaderFactory metadataReaderFactory) throws IOException {
Classmetadata classmetadata = metadataReader.getClassmetadata();
String className = classmetadata.getClassName();
if (classmetadata.equals("UserInfoDaoImpl")){
return true;
}
return false;
}
}
2、@Bean
通过@Bean加入到 IOC 容器
@Configuration
@ComponentScan(value = "dao.impl")
public class MyConfig {
@Bean
public UserInfoDaoImpl userInfoDaoImpl(){
UserInfoDaoImpl userInfoDaoImpl = new UserInfoDaoImpl();
return userInfoDaoImpl;
}
@Bean
//public UserInfoService userInfoService(@Qualifier("userInfoDaoImpl") UserInfoDaoImpl userInfoDaoImpl){
public UserInfoService userInfoService(UserInfoDaoImpl userInfoDaoImpl){//自动匹配类型及变量名相同的 Bean,如果有多个方法重载可通过@Bean("别名")+@Qualifier("别名")的方式引用
UserInfoService userInfoService = new UserInfoService();
userInfoService.setUserMapper(userInfoDaoImpl);
return userInfoService;
}
}
3、@import
3.1
使用 @import({UserInfoService.class,UserInfoDaoImpl.class})
ID值为类的全类名:context.getBean(“dao.impl.UserInfoDaoImpl”);
@Configuration
@import({UserInfoService.class,UserInfoDaoImpl.class})
public class MyConfig {
}
3.2
实现 importSelector 接口并通过 @import({MyimportSelector.class})注册该实现类
public class MyimportSelector implements importSelector {
public String[] selectimports(Annotationmetadata importingClassmetadata) {
return new String[]{"dao.impl.UserInfoDaoImpl","service.impl.UserInfoService"};
}
}
@Configuration
@import({MyimportSelector.class})
public class MyConfig {
}
3.3
实现 importBeanDefinitionRegistrar 接口并通过 @import({MyimportBeanDefinitionRegistrar.class})注册该实现类
public class MyimportBeanDefinitionRegistrar implements importBeanDefinitionRegistrar {
public void registerBeanDefinitions(Annotationmetadata importingClassmetadata, BeanDefinitionRegistry registry) {
BeanDefinition beanDefinition = new RootBeanDefinition(UserInfoDaoImpl.class);
registry.registerBeanDefinition("userInfoDaoImpl",beanDefinition);
}
}
@Configuration
@import({MyimportBeanDefinitionRegistrar.class})
public class MyConfig {
}
4、FactoryBean
实现 FactoryBean 接口并通过 @Bean 注册该实现类
public class MyFactoryBean implements FactoryBean {
public Object getObject() throws Exception {
return new UserInfoDaoImpl();
}
public Class> getObjectType() {
return UserInfoDaoImpl.class;
}
public boolean isSingleton() {
return true;
}
}
通过 @Bean 注册该实现类
@Configuration
public class MyConfig {
@Bean
public MyFactoryBean myFactoryBean() {
return new MyFactoryBean();
}
}
取 Bean
//context.getBean("myFactoryBean")获取的是工厂创建的实例
UserInfoDaoImpl userInfoService = (UserInfoDaoImpl) context.getBean("myFactoryBean");
//context.getBean("&myFactoryBean")添加 & 获取的是工厂
MyFactoryBean myFactoryBean = (MyFactoryBean) context.getBean("&myFactoryBean");



