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

SpringBoot底层注解

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

SpringBoot底层注解

1.@Configuration

作用:
1.给Spring容器注册组件,相当于之前在spring的xml文件中注册组件
2.被@Configuration标记的类被标记为一个配置类,相当于一个xml文件
3.@bean(“别名”)注解可以给注册的组件命名别名
4.@Configuration默认是单例,无论获取多少次都是一个对象
5.配置类本身也是一个组件。
6.@Configuartion自spring5.2版本后添加了一个属性proxyBeanMethods,含义是,是否启动代理模式,当启动时,容器中只有一个容器中注册的对象,当不启动时,即proxyBeanMethods = false时,每获取一次容器中注册的组件,都会产生一个新的对象。这个属性一般用来解决组件之间的依赖问题,当容器中注册的组件要依赖容器中注册的其他组件时,一般使用代理模式,保证所依赖的对象就是容器中所注册的组件。

例子1:下面是一个配置类

 
@Configuration
public class MyConfig01 {
    @Bean
    public Pat getPat(){
        return new Pat("小狗","欢欢",2);
    }
    @Bean("user001")
    public User getUser(){
        return new User("加里奥",28);
    }
}

例子2:@Configuration的两种模式,当proxyBeanMethods = true时,是单例模式,当proxyBeanMethods = flase时,每获取一次容器中注册的对象,都会产生一个新的对象。

@Configuration(proxyBeanMethods = true)
public class MyConfig02 {

    @Bean("root")
    public User getUser(){
        User xiaoming = new User("小明", 18);
        xiaoming.setPat(getPat());//这个组件依赖下面的Pat
        return xiaoming;
    }
    
    @Bean
    public Pat getPat(){
        return new Pat("奥斯卡","小狗",1);
    }
}

   public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(SpringBootTestApplication.class, args);
        User root = run.getBean(User.class);
        Pat pat = run.getBean(Pat.class);
        System.out.println(pat == root.getPat());//当proxyBeanMethods = true时打印true,当roxyBeanMethods = false时,返回false
        
    }

另外这些注解@Bean、@Controller、@Repository、@Service、@Component也可以实现向容器中注册组件的功能,还有@ComponentScan通过指定扫描的包,也会将包下的所有类注册到容器中

2.@ipmort

1.@ipmort可以配合其他向容器中注册组件的注解使用,例如:@Configuration、@Bean、@Controller、@Repository、@Service、@Component
2.使用@Ipmort注解可以导入任何组件,包括我们自己写的或者通过依赖导入的组件,在加载配置类时,会调用导入类的无参构造,给容器注册导入的组件。

例子:

@Import({User.class, Pat.class, DoubleAdder.class})
@Configuration
public class MyConfig03 {
}

public static void main(String[] args) {
     ConfigurableApplicationContext run = SpringApplication.run(SpringBootTestApplication.class, args);
     System.out.println(run.getBean(User.class));
     System.out.println(run.getBean(Pat.class));
     System.out.println(run.getBean(DoubleAdder.class));
    }

3.@Conditional

1.条件注解,当满足某些条件时,才给容器注入某些注解
2…@Conditional是一个根注解,它下面有很多子注解,在使用时候,根据不同的条件使用,
例如:@ConditionalOnClass:当容器中有某个calss时才注入;@ConditionalOnWebApplication:当项目时一个web应用时才注入;@ConditionalOnBean:当容器中存在某个bean实例时才注入等等;

例子:

@ConditionalOnClass(Pat.class)
@Import(Pat.class)//如果不导入pat组件,则不会注册下面的user,但是Myconfg04依然会存在容器中
@Configuration()
public class MyConfig04 {
    @Bean("root")
    public User getUser(){
        User xiaoming = new User("小明", 18);
        return xiaoming;
    }
}
4.@ImportResource

用于导入spring的配置文件

例子:

package com.example.springboottest.config;

import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource("classpath:spring.xml")
public class MyConfig05 {
}




    
        
        
    



5.@ConfigurationProperties

1.用于配置绑定,一般用于将配置类中的属性和配置文件中的属性进行绑定
2.注意:只有在容器中的组件才可以进行配置绑定

例子:
application.yml:

datasource:
  name: xiaoming
  password: 123456
package com.example.springboottest.domin;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "datasource")//perfix表示配置文件中的前缀,另外属性名必须相同
public class DataSource {
    private String name;
    private String password;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

另一个属性配置注解@EnableConfigurationProperties

1.作用:在配置类中配置属性绑定,但是要指定开启谁的属性配置
2.这个注解可以用来配置没有注册到容器中的类

例子:

package com.example.springboottest.domin;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

//@Component 不添加这个注解
@ConfigurationProperties(prefix = "datasource")
public class DataSource {
    private String name;
    private String password;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
//配置类
package com.example.springboottest.config;

import com.example.springboottest.domin.DataSource;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(DataSource.class)
public class MyConfig06 {
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1003241.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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