• Java类配置Spring



    学习视频来自于:秦疆(遇见狂神说)Bilibili地址
    他的自学网站:kuangstudy

    但行好事,莫问前程


    一、Java类配置Spring

    1.1 介绍

    我们现在要完全不使用Spring的xml配置了,全权交给Java来做!
    JavaConfig是Spring的一个子项目,在Spring4之后,它成为了一个核心功能!
    使用AnnotationConfigApplicationContext来读取配置
    在这里插入图片描述

    1.1.1 @Configuration的作用

    @Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

    1. @Configuration 这个也会被Spring容器托管 注册到容器中 因为它本来就是一个@Component
    2. @Configuration 代表这是一个配置类,就和之前的xml配置文件一样

    1.1.2 @Bean的作用

    将这个类或者方法注册到spring IoC容器中,这个配置就等同于之前在xml里的配置

    <beans>
        <bean id="getUser" class="pers.tianyu.pojo.User"/>
    beans>
    
    • 1
    • 2
    • 3
    1. 注册一个bean,就相当于之前写的一个bean标签
    2. 这个方法的名字(getUser)就相当于bean标签中的id
    3. 这个方法的返回值(User)就相当于bean标签中的class属性

    1.1.3 @componentscan的作用

    @ComponentScan告诉Spring 哪个packages 用注解标识的类 ,会被spring自动扫描并且装入bean容器。

    如果你有个类用@Controller注解标识了,那么配置类不加上@ComponentScan指定包,无法自动扫描该controller,那么该Controller就不会被spring扫描到,更不会装入spring容器中,因此你配置的这个Controller也没有意义。

    1.2 使用

    1.2.1 方式一

    在配置类中写方法

    实体类

    public class User {
        private String name;
    
        public String getName() {
            return name;
        }
        @Value("天宇")
        public void setName(String name) {
            this.name = name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    配置文件

    @Configuration // 代表这是一个Spring的配置类
    public class JavaConfig {
        @Bean
        public User getUser() {
            return new User();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试类

    public class UserTest {
        public static void main(String[] args) {
            ApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
            User user = context.getBean("getUser", User.class);
            System.out.println(user.getName());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.2.3 方式二

    使用注解和自动扫描

    实体类

    @Component(value = "getUser")
    public class User {
        private String name;
    
        public String getName() {
            return name;
        }
        @Value("天宇")
        public void setName(String name) {
            this.name = name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    配置文件

    @Configuration // 代表这是一个Spring的配置类
    @ComponentScan("pers.tianyu.pojo") // 需要扫描的包
    public class JavaConfig {
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    测试类

    public class UserTest {
        public static void main(String[] args) {
            ApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
            User user = context.getBean("getUser", User.class);
            System.out.println(user.getName());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.3 @Import的作用

    传入其他自定义配置类

    自定义配置类

    @Configuration
    public class UserConfig {
    
        @Bean
        public User getUser() {
            return new User();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    主配置类

    @Configuration // 代表这是一个Spring的配置类
    @Import(value = UserConfig.class) // 加载自定义配置类
    public class JavaConfig {
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    实体类

    public class User {
        private String name;
    
        public String getName() {
            return name;
        }
        @Value("天宇")
        public void setName(String name) {
            this.name = name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    测试类

    public static void main(String[] args) {
    //        如果完全使用配置类的方式去做,我们就只能通过ApplicationContext 上下文来获取容器,通过配置类的class对象加载
        ApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
        User user = context.getBean("getUser", User.class);
        System.out.println(user.getName());
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.4 @PropertySource(“mysql.properties”)

    mysql.properties

    driverClassName=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/smbms?userUnicode=true&characterEncoding=utf8&useSSL=true&serverTime=GMT%2B8
    username=root
    password=root
    
    • 1
    • 2
    • 3
    • 4

    maven

    <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>druidartifactId>
        <version>1.2.11version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    配置文件

    @Configuration
    @PropertySource("mysql.properties")
    public class MySQLConfig {
        @Value("${driverClassName}")
        private String driverClassName;
        @Value("${url}")
        private String url;
        @Value("${username}")
        private String username;
        @Value("${password}")
        private String password;
    
        @Bean
        public DruidDataSource getDruidDataSource() {
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setDriverClassName(driverClassName);
            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            return dataSource;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    测试

    public class UserTest {
        public static void main(String[] args) {
            ApplicationContext context = new AnnotationConfigApplicationContext(MySQLConfig.class);
            DataSource bean = context.getBean("getDruidDataSource", DataSource.class);
            System.out.println(bean);
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    MyBatis
    索引——MySQL
    【架构与设计】常见微服务分层架构的区别和落地实践
    多维时序 | MATLAB实现SSA-CNN-BiGRU-Attention多变量时间序列预测(SE注意力机制)
    P1006 [NOIP2008 提高组] 传纸条,棋盘型dp,路径dp
    【Vue】ref,reactive 响应式引用的用法和原理(1)
    初识C++ (三)
    C++简单实现内存池原理
    数据挖掘-模型的评估(四)
    带你深入Java Log框架,彻底搞懂Log4J、Log4J2、LogBack,SLF4J
  • 原文地址:https://blog.csdn.net/zhao854116434/article/details/126175164