栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring(六)-@Configuration注解形式配置 IOC

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring(六)-@Configuration注解形式配置 IOC

以下两个类分别使用配置形式与注解形式加入 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");
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/310453.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号