Spring及SpringBoot常用注解

1.@Scope:设置组件的作用域

@Configuration
@Import({Colour.class, Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class MainConfig {


    /* ConfigurableBeanFactory#SCOPE_PROTOTYPE   prototype  多实例
     *     IOC容器启动并不会去调用方法创建对象放在容器中,每次获取的时候才会调用对象创建对象
     * ConfigurableBeanFactory#SCOPE_SINGLETON   singleton  单实例(默认值)
     *     IOC容器启动会调用方法创建对象放到IOC容器中,以后每次获取就是直接从容器中(三级缓存)中拿
     * org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST request  同一个请求创建一个实例
     * org.springframework.web.context.WebApplicationContext#SCOPE_SESSION session  同一个session创建一个实例
     *
     
     */
    @Scope("prototype")
    @Bean
    public Person person(){
        System.out.println("person对象的创建过程..............");
        return new Person("nieyp","24");
    }
}

2.@Lazy:是否懒加载

@Configuration
public class MainConfig {
    /* 
     * 懒加载:
     *      单实例bean:默认在容器启动的时候创建对象
     *      懒加载:针对单实例Bean,容器启动时不创建对象,第一次获取Bean的时候创建对象
     */
    @Lazy
    @Bean
    public Person person(){
        System.out.println("person对象的创建过程..............");
        return new Person("nieyp","24");
    }
}

3.@AutoWired

/**
     * @Autowired:自动注入:
     *   1)优先按照类型去容器中找对应的组件:
     *   2)如果找到多个相同类型的组件,再将属性的名称作为组件Id去容器中查找
     *   3)@Qualifier("bookDao"):使用指定的组件ID装配,而不是使用默认的组件Id
     *   4)@Primary:让Spring进行自动装配的时候,默认使用首选的bean
     *   5)@Autowired标注的地方:构造器,参数,方法,属性:都是从容器中获取参数组建的值
     *      构造器:如果组件只有一个有参构造器,这个有参构造器的@Autowried可以省略,参数位置的组件 
     *              还是可以自动获取
     *      标注在实体类方法位置:@Bean标注的方法创建对象的时候,方法参数的值(需要自动注入的值)可 
     *              以从容器中获取,不必写@Auotwired(如例1)
     *      配置类位置:需要参数作为构造方法的参数是不需要@autowired(如例2)
     *
     * Spring还支持使用@Resuorce(JSR250)和@Inject(JSR330)[java规范的注解]
     *   @Resuorce:
     *      可以和@Autowired一样实现自动装配的功能;默认是按照组件名称进行装配的
     *      不支持@Primary功能,不支持@Autowired(required=false)
     *   @Inject:
     *      需要导入java.inject的包,和Autowired的功能一样,没有required=false功能
     */
//例1
public class Person {
    private String name;
    private String age;
    private City city;
    public City getCity() {
        return city;
    }
    @Autowired
    //标注在方法上,Spring容器创建当前对象,就会调用方法,完成赋值
    //方法使用的参数,自定义类型的从IOC容器中获取(标注在有参构造上上同理(如果只有一个有参构造器,@AutoWired可以省略),也可以直接放在参数位置)
    public void setCity(City city) {
        this.city = city;
    }
}

//例2(前提是car和student已经注册到了Ioc容器中)
@Bean
    public Person1 person1(Car car, Student student){
        return new Person1(car,student);
    }

4.Bean的初始化和销毁

    /* 
     *   Bean的初始化和销毁方法
     *      1)通过@Bean指定init-method和destroy-method
     *      2)通过Bean实现InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑)
     *      3)可以使用JSR250
     *              @PostConstruct:在Bean创建完成并且属性赋值完成;来执行初始化方法
     *              @PreDestroy:在容器销毁Bean之前通知我们进行清理工作
     *      4)BeanPostProcessor:Bean的后置处理器在Bean初始化前后做一些处理工作
     *              postProcessBeforeInitialization:在初始化之前工作
     *              postProcessAfterInitialization:在初始化之后工作
     */

5.@Import

@Configuration
@Import({Colour.class, Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class MainConfig {


    /* 
     *
     * 给容器中注册组件
     *      1)包扫描+组件标注注解
     *      2)@Bean[导入的第三方包里面的组件]
     *      3)@Import[快速给容器中导入组件]
     *         1)@Import(要导入到容器中的组件);容器中会自动注册,id默认是全类名
     *         2)ImportSelector:返回需要导入的组件的全类名数组;
     *         3)ImportBeanDefinitionRegistrar:手动注册bean到容器中
     *      4)使用Spring提供的FactoryBean(工厂Bean)
     *         1)默认获取到的是工厂bean调用getObject创建的对象
     *         2)要获取工厂Bean本身,我们需要给ID前面加一个&
     */
}


public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        System.out.println(importingClassMetadata.getAnnotations());
        System.out.println(importingClassMetadata.getAnnotations());
        return new String[0];
    }
}



public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
        registry.registerBeanDefinition("rainBow",rootBeanDefinition);
    }
}

6.@ConfigurationPropertie+@Component

@ConfigurationProperties:通常是用来将properties和yml配置文件属性转换为bean对象使用,有一个prefix属性:需要指定配置文件中某些属性的前缀,会自动匹配到bean对象的某些属性上面.结合@Component将转换后的bean对象放入Ioc容器中

@Component
@ConfigurationProperties(prefix = "nieyp.blog")
public class ConfigBean {
    private String cource;
    private String name;
    set/get+tostring
}


application.yml:
        nieyp.blog.cource:springBoot
        nieyp.blog.name:blog



@RestController
public class TestController {

   
    @Autowired
    ConfigBean configBean;

    @GetMapping("/getMessage")
    public void getMessage() {
        System.out.println(configBean.toString());
    }
}

7.@EnableConfigurationProperties

@EnableConfigurationProperties在文档中解释 :当@EnableConfigurationProperties注解应用到你的@Configuration时,任何被@ConfigurationProperties注解的beans将自动被Environment属性配置 .这种风格的配置特别适合与SpringApplication的外部YAML配置进行配合使用。(@EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入.)

//将@ConfigurationProperties标注的类注册到BeafFactory
@EnableConfigurationProperties
@Configuration
public class PersonConfiguraiton {
}

8.@Value

public class Student {
    /**
     * 使用@value赋值
     * 1,基本数值
     * 2,可以写SpEL:#{}
     * 3,可以写${}:取出配置文件中的值(在运行环境变量中的值:配置文件中的值最终都会放到Enviromnent 
     *          中)
     *   也可以结合PropertySource读取配置文件中的值
     * 

     *  也可以让配置类实现EmbeddedValueResolverAware,定义一个属性将实现方法中的解析器赋值给该 
        属性,调用该属性的resolveStringValue("${xxxx}")
     */

    @Value("123123")
    private String name;
    //@Value("#{20-3}")
    @Value("123123")
    private String age;
    @Value("${person.nickName}")
    private String nickName;
}

@PropertySource(value = {"classpath:/person.properties"})
@Configuration
public class MainConfigOfPropertyValue {
    @Bean
    public Student student(){
        return new Student();
    }
}

9.@Profile:指定组件在哪个环境的情况下才能被注册到容器中

  1. 加了环境标志的bean或者配置类,只有这个环境被激活的时候才能被注册到容器中,默认是default环境
  2. 没有标注任何环境的Bean在任何环境下都是加载的
@Configuration
public class MainConfigOfProfile {

    @Profile("test")
    @Bean
    public DataSource dataSourceTest(){
        return new DataSource("test");
    }

    @Profile("dev")
    @Bean
    public DataSource dataSourceDev(){
        return new DataSource("dev");
    }

    @Profile("pro")
    @Bean
    public DataSource dataSourcePro(){
        return new DataSource("pro");
    }
}

切换不同化境:     

1.使用命令行动态参数(VM arguments): -Dspring.profiles.active=xxxx

2.通过代码       

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); applicationContext.getEnvironment().setActiveProfiles("xxxx"); applicationContext.register(xxxx.class); applicationContext.refresh();

10.@ComponentScan:在Springboot项目中可以重新指定要扫描的包以及排除的某些

//@SpringBootApplication(exclude = {Controller.class, Service.class})
//@ComponentScan(basePackages = {"com.xx.xx.*"}, excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {Controller.class}))
@SpringBootApplication
@ComponentScan(basePackages = {"com.hjj"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值