写点什么

SpringBoot 进阶篇

用户头像
偏执
关注
发布于: 7 小时前

1. SpringBoot 自动配置解析

1.1 需求:在 Spring 的 IOC 容器中有一个 User 的 Bean,现要求:导入 Jedis 坐标后,加载该 Bean,没导入,则不加载.


  1. 首先创建一个 User 类


@Componentpublic class User{}复制代码
复制代码


1.在入口类中


@SpringBootApplicationpublic class SpringbootConditionApplication {	public static void main(String[] args) {		ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args);        Object user = context.getBean("user");        System.out.println(user);    }}复制代码
复制代码


总结:发现都可以访问到 user 对象,不需要任何条件限制,但是我们的要求是导入 jedis 后才可以加载。

1.2 加入 jedis 后,@Conditional 要配和 Condition 的实现类(ClassCondition)进行使用.

  1. 定义 ClassCondition,实现 Condition 接口类


public class ClassCondition implements Condition {    /**     *     * @param context 上下文对象。用于获取环境,IOC容器,ClassLoader对象     * @param metadata 注解元对象。 可以用于获取注解定义的属性值     * @return     */    @Override    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {      //1.需求: 导入Jedis坐标后创建Bean        //思路:判断redis.clients.jedis.Jedis.class文件是否存在        boolean flag = true;        try {            Class<?> cls = Class.forName("redis.clients.jedis.Jedis");        } catch (ClassNotFoundException e) {            flag = false;        }        return flag;    }}复制代码
复制代码


  1. 添加 UserConfig


@Configurationpublic class UserConfig {    @Bean    @Conditional(ClassCondition.class)    public User user(){        return new User();    }}复制代码
复制代码


  1. 测试


@SpringBootApplicationpublic class SpringbootConditionApplication {

public static void main(String[] args) { //启动SpringBoot的应用,返回Spring的IOC容器 ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args);
Object user = context.getBean("user"); System.out.println(user);
}}复制代码
复制代码

1.3 需求:将类的判断定义为动态的。判断哪个字节码文件存在可以动态指定

  1. 自定义条件注解类


import org.springframework.context.annotation.Conditional;import java.lang.annotation.*;
@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Conditional(ClassCondition.class) //此处@ConditionOnClass为自定义注解public @interface ConditionOnClass { String[] value();}复制代码
复制代码


@Configurationpublic class UserConfig {
@Bean //@Conditional(ClassCondition.class) @ConditionOnClass("com.alibaba.fastjson.JSON") public User user(){ return new User(); } @Bean @ConditionalOnProperty(name = "itcast",havingValue = "itheima") public User user2(){ return new User(); }
}复制代码
复制代码


测试 User 对象的创建


@SpringBootApplicationpublic class SpringbootConditionApplication {

public static void main(String[] args) { //启动SpringBoot的应用,返回Spring的IOC容器 ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args);
Object user = context.getBean("user"); System.out.println(user); }
}复制代码
复制代码


总结:

1.ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化 Bean;
2.ConditionalOnClass:判断环境中是否有对应字节码文件才初始化 Bean;
3.ConditionalOnMissingBean:判断环境中没有对应 Bean 才初始化 Bean;
1.4 SpringBoot 自动配置-切换内置 web 服务器


==内置四种 web 服务器:==

1.Tomcat 2.Netty 3.Jetty 4.Undertow


  <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>        <!--排除tomcat依赖-->        <exclusions>            <exclusion>                <artifactId>spring-boot-starter-tomcat</artifactId>                <groupId>org.springframework.boot</groupId>            </exclusion>        </exclusions>    </dependency>                <!--引入jetty的依赖-->        <dependency>            <artifactId>spring-boot-starter-jetty</artifactId>            <groupId>org.springframework.boot</groupId>        </dependency>复制代码
复制代码

1.5 SpringBoot 自动配置-Enable 注解原理


SpringBoot中提供了很多Enable开头的注解,这些注解都是用于动态启用某些功能的。而其底层原理是使用@Import注解导入一些配置类,实现Bean的动态加载.
SpringBoot不能直接获取在其他工程中定义的Bean复制代码
复制代码


==springboot-enable 工程==


** * @ComponentScan 扫描范围:当前引导类所在包及其子包 * * com.itheima.springbootenable * com.itheima.config * //1.使用@ComponentScan扫描com.itheima.config包 * //2.可以使用@Import注解,加载类。这些类都会被Spring创建,并放入IOC容器 * //3.可以对Import注解进行封装。 */  //@ComponentScan("com.cf.config")//@Import(UserConfig.class)@EnableUser@SpringBootApplicationpublic class SpringbootEnableApplication {
public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args); //获取Bean Object user = context.getBean("user"); System.out.println(user); }}复制代码
复制代码


用户头像

偏执

关注

还未添加个人签名 2021.07.23 加入

还未添加个人简介

评论

发布
暂无评论
SpringBoot进阶篇