Spring 注解驱动(一)基本使用规则

Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html)

一、基本使用

@Configuration
@ComponentScan(basePackages = "com.github.binarylei",
excludeFilters = {@Filter(type = FilterType.ANNOTATION, classes = {Controller.class})}
)
@Lazy(false)
public class AnnnotationConfig { // Scope 可取四个值:SCOPE_SINGLETON、SCOPE_PROTOTYPE、SCOPE_SESSION、SCOPE_REQUEST
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public User user() {
return new User();
}
}

启动测试:

public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnnotationConfig.class);
// AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
// context.register(AnnnotationConfig.class);
// context.refresh(); User user = context.getBean(User.class);
}

二、@ComponentScan

@Configuration
@ComponentScan(basePackages = "com.github.binarylei",
excludeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = {Controller.class}),
@Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {User.class}),
@Filter(type = FilterType.CUSTOM,classes = MyFilter.class)
}, useDefaultFilters = false
)
public class AnnnotationConfig {
}

自定义的包扫描如下:

public class MyFilter implements TypeFilter {

    /**
* @param metadataReader 当前类的信息
* @param metadataReaderFactory 获取其他类的信息
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
throws IOException {
// 1. 当前类的注解信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
// 2. 当前类的信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
// 3. 当前类的资源信息(类路径)
Resource resource = metadataReader.getResource();
return true;
}
}

三、@Conditional

@Bean
@Conditional(MyCondition.class)
public User user() {
return new User();
} // 条件装配
public class MyCondition implements Condition { @Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 1. IOC 容器
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
// 2. 类加载器
ClassLoader classLoader = context.getClassLoader();
// 3. 环境变量
Environment environment = context.getEnvironment();
// 4. 可以向容器中注册 BeanDefinition
BeanDefinitionRegistry registry = context.getRegistry();
return environment.getProperty("os.name").contains("Windows");
}
}

四、@Import

给容器中注册组件有以下方式:

  1. @Bean
  2. 包扫描(@ComponentScan) + 注解(@Componet/@Repository/@Service/@Controller)
  3. @Import
    • @Import({User.class}) 导入单个组件
    • @Import({User.class, MyImportSelector.class}) MyImportSelector 批量导入组件
    • @Import({User.class, MyImportBeanDefinitionRegistrar.class}) MyImportBeanDefinitionRegistrar 批量导入组件
  4. FactoryBean
@Import({User.class, MyImportSelector.class})
@Import({User.class, MyImportBeanDefinitionRegistrar.class})
public class AnnnotationConfig {
} // 返回类名的全定限名称
public class MyImportSelector implements ImportSelector { /**
* @param importingClassMetadata 获取标注 @Import 注解的类所有注解信息(不仅仅是 @Import)
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// 不要返回 null,否则会报空指针异常
return new String[]{User.class.getName()};
}
} // 使用 BeanDefinitionRegistry 注册
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { /**
* @param importingClassMetadata 获取标注 @Import 注解的类所有注解信息(不仅仅是 @Import)
* @param registry 向容器中注册 BeanDefinition
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) { boolean definition1 = registry.containsBeanDefinition("red");
boolean definition2 = registry.containsBeanDefinition("blue");
if (definition1 && definition2) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(User.class);
registry.registerBeanDefinition("user", beanDefinition);
}
}
}

五、Bean 的生命周期

  1. @Bean(initMethod = "init", destroyMethod = "destroy")
  2. 实现 InitializingBean, DisposableBean 接口

每天用心记录一点点。内容也许不重要,但习惯很重要!

Spring 注解驱动(一)基本使用规则的更多相关文章

  1. 【Spring注解驱动开发】组件注册-@ComponentScan-自动扫描组件&指定扫描规则

    写在前面 在实际项目中,我们更多的是使用Spring的包扫描功能对项目中的包进行扫描,凡是在指定的包或子包中的类上标注了@Repository.@Service.@Controller.@Compon ...

  2. 【Spring注解驱动开发】自定义TypeFilter指定@ComponentScan注解的过滤规则

    写在前面 Spring的强大之处不仅仅是提供了IOC容器,能够通过过滤规则指定排除和只包含哪些组件,它还能够通过自定义TypeFilter来指定过滤规则.如果Spring内置的过滤规则不能够满足我们的 ...

  3. 0、Spring 注解驱动开发

    0.Spring注解驱动开发 0.1 简介 <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作 ...

  4. 【spring 注解驱动开发】spring组件注册

    尚学堂spring 注解驱动开发学习笔记之 - 组件注册 组件注册 1.@Configuration&@Bean给容器中注册组件 2.@ComponentScan-自动扫描组件&指定扫 ...

  5. 你真的知道Spring注解驱动的前世今生吗?这篇文章让你豁然开朗!

    本篇文章,从Spring1.x到Spring 5.x的迭代中,站在现在的角度去思考Spring注解驱动的发展过程,这将有助于我们更好的理解Spring中的注解设计. Spring Framework ...

  6. Spring 注解驱动(二)Servlet 3.0 注解驱动在 Spring MVC 中的应用

    Spring 注解驱动(二)Servlet 3.0 注解驱动在 Spring MVC 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/1019 ...

  7. 1、课程简介-Spring 注解驱动开发

    1.课程简介-Spring 注解驱动开发

  8. 【Spring注解驱动开发】聊聊Spring注解驱动开发那些事儿!

    写在前面 今天,面了一个工作5年的小伙伴,面试结果不理想啊!也不是我说,工作5年了,问多线程的知识:就只知道继承Thread类和实现Runnable接口!问Java集合,竟然说HashMap是线程安全 ...

  9. 【Spring注解驱动开发】使用@Scope注解设置组件的作用域

    写在前面 Spring容器中的组件默认是单例的,在Spring启动时就会实例化并初始化这些对象,将其放到Spring容器中,之后,每次获取对象时,直接从Spring容器中获取,而不再创建对象.如果每次 ...

随机推荐

  1. svn git 必须理解的概念

    不都是SCM代码管理嘛,有很大区别么?很多svn老鸟都是抱着这样的心态去学习git,然后无一幸免地陷入“查阅过很多资料,依然掌握不好”的困境,至少我们团队是这样的. 网上的资料确实已经很多了,却没有把 ...

  2. springboot 线程池

    我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,今天我们就来实战体验这个线程池服务: 本 ...

  3. Navicat的外键设置

    “名”:可以不填,你一会保存成功系统会自动生成. “栏位”:这个子表哪个键设置为外键. “参考数据库”:外键关联的数据库. “参考表”:关联的父表 “参考栏位”:父表关联的的字段,一般是id “删除时 ...

  4. U3D框架—单例框架

    写程序应遵循的原则:高内聚(内容的聚合),低耦合(功能与功能之间的联系) 代码里尽量不要有冗余:既重复,没有用的代码 using System.Collections; using System.Co ...

  5. Java 日期时间 Date类型,long类型,String类型表现形式的转换

    Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型 java.util.Date dt = new Date(); ...

  6. 对象转化为json

    google开发的Gson转换利器,String json = new Gson ().toJson(object); 一行代搞定. 别忘了引入jar包 转自:https://zhidao.baidu ...

  7. angularjs 获取$scope对象

    参考 https://blog.csdn.net/u011974399/article/details/77865293 angular.element("[ng-controller=xx ...

  8. Java Web开发和Python Web开发之间的区别

    今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...

  9. dedecms list 添加自定义字段方法

    在内容模型管理中,添加字段时需这样:

  10. LibreOJ 6282. 数列分块入门 6

    题目链接:https://loj.ac/problem/6282 参考博客:http://www.cnblogs.com/stxy-ferryman/p/8560551.html 这里如果用数组的话元 ...