Spring-IOC进阶注解

我们之后可能用SpringBoot创建项目,但是里面有些注解其实是SpringFramework的,简单讲几个

@Configuration

此注解可以替代配置文件,就是那个Spring的xml文件配置,也可以理解成<beans>标签

@Configurationpublic class AppConfig {}
//使用注解配置之后,实现类就不是ClassPathXmlApplicationContext而是AnnotationConfigApplicationContext//配置类本身也是组件,所以容器中会注册此对象ApplicationContext context=new AnnotationConfigApplicationContext(AppConfig.class);或者注解配置类的包路径ApplicationContext context=new AnnotationConfigApplicationContext("com.ty");//查看容器里面的组件 for (String beanDefinitionName : context.getBeanDefinitionNames()) {            System.out.println(beanDefinitionName);        }

@Bean

创建对象,等同于配置文件中<bean>标签

@Beanpublic User user(){    return new User();}//测试 ApplicationContext context=new AnnotationConfigApplicationContext(AppConfig.class); Object user = context.getBean("user"); System.out.println(user);

@Bean可以指定id名字:@Bean("id")

ps:在Spring5.2之后此注解搭配@Configuration使用时,@Configuration注解可以添加proxyBeanMethods参数

默认值是true,用来检查在容器中是否有这个组件

public class User {    private Integer id;    private String username;    private Book book;        /*getter/setter/toString/构造方法
public class Book {    private String name;        /*getter/setter/toString/构造方法
@Configuration(proxyBeanMethods = true)public class MyConfig {    @Bean    public User getUser() {        User user = new User(18, "james");        //getUser组件依赖了getBook组件        user.setBook(getBook());        return user;    }    @Bean    public Book getBook() {        return new Book("三国");    }}
//测试@Testpublic void test3() {    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);    User user = (User) context.getBean("getUser");    Book userBook = user.getBook();    Book book = (Book) context.getBean("getBook");    System.out.println(userBook == book); //true}

说明:

  • 当proxyBeanMethods = true时,代表Full模式,保证每个@Bean方法被调用多少次返回的组件都是单实例的

    • 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
  • 当proxyBeanMethods = false时,代表Lite模式,每个@Bean方法被调用多少次返回的组件都是新创建的

    • 配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断

@ComponentScan

注解扫描,作用和配置文件中的<context:component-scan />标签相同

@ComponentScan(basePackages = "com.ty.bean")

同样跟配置文件一样,可以用过滤规则指定扫描包,即排除过滤和包含过滤

@ComponentScan(basePackages = "com.ty",excludeFilters = @ComponentScan.Filter(type =         FilterType.ASPECTJ,pattern = "com.ty.bean.*"))
@ComponentScan(basePackages = "com.ty", useDefaultFilters = false, includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Repository.class))

过滤规则有多个的时候,可以用大括号,比如:

@ComponentScan(basePackages = "com.ty.dao", useDefaultFilters = false, includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Repository.class, Service.class}), @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "*..UserDaoImpl2")})

@Import

给容器中自动导入创建出所需的组件、默认组件的名字就是全类名

@Configuration@Import({Book.class, Log4jMDCAdapter.class})public class AppConfig {}

@Import还可以搭配ImportSelector和ImportBeanDefinitionRegistrar

  • ImportSelector:返回所需导入组件的全类名数组

  • ImportBeanDefinitionRegistrar:手动注册到bean容器

@Conditional

条件装配:满足Conditional指定的条件,则进行组件注入

(0)

相关推荐

  • SpringBoot-常见问题(一)

    参考: https://www.cnblogs.com/nihaorz/p/10528121.html https://www.cnblogs.com/tanwei81/p/6814022.html ...

  • 死磕Spring之IoC篇 - 深入了解Spring IoC(面试题)

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  • spring 框架常用注解

    spring 框架常用注解

  • 解析:Spring IoC容器

    IoC容器是Spring的核心,也可以称为Spring容器.Spring通过IoC容器来管理对象的实例化和初始化,以及对象从创建到销毁的整个生命周期. Spring中使用的对象都由IoC容器管理,不需 ...

  • 工厂模式讲解, 引入Spring IOC

    目录 引入 简单工厂 抽象工厂 Spring的bean工厂 模拟Spring工厂实现 模拟IOC 引入 假设有一个司机, 需要到某个城市, 于是我们给他一辆汽车 public class Demo { ...

  • spring IOC的理解

    spring IOC的理解

  • spring aop 自定义注解实现本地缓存

    spring aop 自定义注解实现本地缓存

  • Spring Ioc的原理

    今天给大家介绍一下关于SpringIoc原理的详解,首先Ioc是InversionofControl.翻译过来就是控制反转,意思是对象之间的关系不再由传统的程序来控制,而是由spring容器来统一控制 ...

  • Java开发中SSM框架整合开发之 Spring IoC

     Spring IoC的基本概念 控制反转(Inversion of Control,IoC)是一个比较抽象的概念,是Spring框架的核心,用来消减计算机程序的耦合问题.依赖注入(Dependenc ...

  • spring cloud Feign使用@RequestLine注解问题

    来源:https://blog.csdn.net/zxl646801924/article/details/80626522 spring boot 项目需要调用其它项目的接口试使用spring cl ...