Spring5学习随笔-高级注解(@ComponentScan、@Configuration.....),替换XML配置文件

这篇具有很好参考价值的文章主要介绍了Spring5学习随笔-高级注解(@ComponentScan、@Configuration.....),替换XML配置文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】

第三章、Spring的高级注解(Spring3.x及以上)

1.配置Bean

Spring在3.x提供的新的注解,用于替换XML配置文件。

@Configuration
public classAppConfig{
	
}

问题

  1. 配置Bean在应用的过程中替换了XML具体的什么内容?

Spring5学习随笔-高级注解(@ComponentScan、@Configuration.....),替换XML配置文件

  1. AnnotationConfigApplicationContext

    1.创建工厂代码
    	ApplicationContext ctx = new AnnotationConfigApplicationContext();
    2.指定配置文件
    	1. 指定配置bean的Class
    			ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
    	2. 指定配置bean所在的路径
    			ApplicationContext ctx = new AnnotationConfigApplicationContext("com.baizhi");
    
    • 配置Bean开发的细节分析
      • 基于注解开发使用日志

        不能集成Log4j(落后了)

        集成新的日志技术:logback

        • 引入相关jar

          <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-api</artifactId>
              <version>1.7.26</version>
          </dependency>
          
          <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>jcl-over-slf4j</artifactId>
              <version>1.5.6</version>
          </dependency>
          
          <dependency>
              <groupId>ch.qos.logback</groupId>
              <artifactId>logback-classic</artifactId>
              <version>1.2.12</version>
          </dependency>
          
          <dependency>
              <groupId>ch.qos.logback</groupId>
              <artifactId>logback-core</artifactId>
              <version>1.2.12</version>
          </dependency>
          
          <dependency>
              <groupId>org.logback-extensions</groupId>
              <artifactId>logback-ext-spring</artifactId>
              <version>0.1.5</version>
          </dependency>
          
        • 引入logback配置文件(logback.xml)

          <?xml version="1.0" encoding="UTF-8" ?>
          <configuration>
              <!-- 控制台输出-->
              <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
                  <encoder>
                      <!--格式化输出:%d标识日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
                      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} {%thread} %-5level %logger{50} - %msg%n</pattern>
                  </encoder>
              </appender>
              <root level="DEBUG">
                  <appender-ref ref="STDOUT"/>
              </root>
          </configuration>
          
      • @Configuration注解的本质

        本质:也是@Component注解的衍生注解

        可以应用<context:component-scan进行扫描,但是实际开发不会这么做。

2.@Bean注解

@Bean注解在配置bean中进行使用,等同于XML配置文件中的<bean标签

1.@Bean注解的基本使用

  • 对象的创建

Spring5学习随笔-高级注解(@ComponentScan、@Configuration.....),替换XML配置文件

1. 简单对象
    
    直接能够通关new方式创建的对象:User UserService UserDAO
    
2. 复杂对象
    
    不能通过new方式创建的对象:Connection SqlSessionFactory
    
    ```java
    /**
     * 创建复杂对象
     * Connection 不能直接通过new 创建
     */
    @Bean
    public Connection conn() {
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool?useSSL=false", "root", "123456");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    ```
    
- @Bean注解创建复杂对象的注意事项
    
    ```java
    遗留系统整合比较常见,自己写还是通过上面的方式
    @Bean
    public Connection conn1(){
        Connection conn = null;
        try {
            ConnectionFactoryBean factoryBean = new ConnectionFactoryBean();
            conn = factoryBean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
    ```
  • 自定义id值

    @Bean("id)
    
  • 控制对象创建次数

    @Bean
    @Scope("singleton | prototype") 默认值 singleton
    

2.@Bean注解的注入

  • 用户自定义类型

    @Bean
    public UserDao userDAO(){
        return new UserDaoImpl();
    }
    
    //可以通过形参传入userDao,也可以调用方法获取userDao
    @Bean
    public UserService userService(){
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(userDAO());
        return userService;
    }
    
  • JDK类型的注入

    @Bean
    public Customer customer(){
        Customer customer = new Customer();
        customer.setId(1);
        customer.setName("xiaohei");
        return customer;
    }
    
    • JDK类型注入的细节分析

      如果直接在代码中进行set方法的调用,会存在耦合的问题

      @Configuration
      @PropertySource("classpath:/init.properties")
      public class AppConfig1 {
      
          @Value("${id}")
          private Integer id;
          @Value("${name}")
          private String name;
      @Bean
          public Customer customer(){
              Customer customer = new Customer();
              customer.setId(id);
              customer.setName(name);
              return customer;
          }
      }
      

3.@ComponentScan注解

@ComponentScan注解在配置bean中进行使用,等同于xml配置中的context:component-scan标签

目的:进行相关注解的扫描 @Component @Value…

1.基本使用

@Configuration
@ComponentScan(basePackages = "com.baizhi.scan")
public class AppConfig2 {

}
等价于: <context:component-scan base-package=""/>

2.排除、包含的使用

  • 排除

    @Configuration
    @ComponentScan(basePackages = "com.baizhi.scan",
            excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Service.class})
                                ,@ComponentScan.Filter(type = FilterType.ASPECTJ,pattern = "*..User1")})
    // 第一个排除Service注解,排除了user2对象,第二个排除了User1类
    public class AppConfig2 {
    
    }
    注意**:针对ASPECTJ和REGEX后面的值是pattern,其他都是value**
    
  • 包含

    @ComponentScan(basePackages = "com.baizhi.scan",
    useDefaultFilters = false,//放弃默认扫描策略,必须指定为false
    includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Service.class})})
    public class AppConfig2 {
    
    }
    

4.Spring工厂创建对象的多种配置方式

1.多种配置方式的应用场景 @Component @Bean @Import

Spring5学习随笔-高级注解(@ComponentScan、@Configuration.....),替换XML配置文件

2.配置优先级

@Component及其衍生注解 < @Bean < 配置文件bean标签
优先级高的配置 覆盖优先级低的配置(如果对@Component注解的类不满意,可以用@Bean注解的类进行覆盖,但是id必须同名)

@ImportResource("applicationContext.xml")// 与spring配置文件集成,先读取配置@Bean 在读取配置文件
  • 解决基于注解进行配置的耦合问题
@Configuration
@ImportResource("applicationContext.xml")
public class AppConfig4 {

    @Bean
    public UserDao userDao() {
        return new UserDaoImpl();
    }
}
**在applicationContext.xml 配置bean解耦合**
<bean id="userDAO" class="com.baizhi.injection.UserServiceImplNew"/>
  • 这样产生的问题,还是会有耦合,因为要在原有的AppConfig配置类添加集成代码,解决方法:

    // 新建立一个AppConfig5的配置类,将集成代码放到此类中,再读取多个配置类,可以根据包地址读取所有的配置类
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig4.class,AppConfig5.class);
    ApplicationContext ctx1 = new AnnotationConfigApplicationContext("com.baizhi");
    UserDao userDao = (UserDao) ctx.getBean("userDAO");
    userDao.save();
    

5.整合多个配置信息

  • 为什么会有多个配置信息

    根绝不同类型(事务、数据库连接)拆分多个配置bean的开发,是一种模块化开发的形式,也体现了面向对象各司其职的设计思想

  • 多配置信息整合的方式

    • 多个配置bean的整合
    • 配置Bean与@Component相关注解的整合
    • 配置Bean与SpringXML配置文件的整合
  • 整合多种配置

    • 如何使多配置的信息 汇总成一个整体
    • 实现跨配置的注入

1.多个配置Bean的整合

  • 多配置信息汇总
    1. base-package进行多个配置Bean的整合

Spring5学习随笔-高级注解(@ComponentScan、@Configuration.....),替换XML配置文件

2. @Import
    1. 可以创建对象
    2. 多配置bean的整合

Spring5学习随笔-高级注解(@ComponentScan、@Configuration.....),替换XML配置文件

3. 在工厂创建时,指定多个配置Bean的Class对象
    
    ```java
    // 这种方式日常开发使用较少,了解即可
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig4.class,AppConfig5.class);
    ```
  • 跨配置进行注入
**在应用配置Bean的过程中,不管使用哪种方式进行配置信息的汇总,其操作方式都是通过在成员变量添加@Autowired注解完成**
@Configuration
@Import(AppConfig2.class)
public class AppConfig1 {

    @Autowired
    private UserDao userDAO;

    @Bean
    public UserService userService() {
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(userDAO);
        return userService;
    }
}

@Configuration
public class AppConfig2 {

    @Bean
    public UserDao userDAO(){
        return new UserDaoImpl();
    }
}

适用于应用配置Bean的所有场景

2.配置Bean与@Component相关注解的整合

@Component(@Repostitory)
public class UserDAOImpl implements UserDAO{

}
@Configuration
@ComponentScan("")
public lcass AppConfig3{
		
		@Autowired
		private UserDao userDao;

		@Bean
    public UserService userService() {
        UserServiceImpl userService = new UserServiceImpl();
				 userService.setUserDao(userDao);
        return userService;
    }
}

3.配置Bean与配置文件整合

1.遗留系统的整合
2.配置覆盖

<bean id="userDAO" class="com.baizhi.injection.UserDaoImpl"/>

@Configuration
@ImportResource("applicationContext.xml")
public class AppConfig4 {

    @Autowired
    private UserDao userDao;

    @Bean
    public UserService userService() {
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(userDao);
        return userService;
    }
}

6.配置Bean底层实现原理

Spring在配置Bean加入了@Configuration注解后,底层就会通过Cglib的代理方式,来进行对象相关的配置、处理

Spring5学习随笔-高级注解(@ComponentScan、@Configuration.....),替换XML配置文件

下一章:Spring5学习随笔-纯注解开发、YML详解文章来源地址https://www.toymoban.com/news/detail-747056.html

到了这里,关于Spring5学习随笔-高级注解(@ComponentScan、@Configuration.....),替换XML配置文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring5学习随笔-整合MyBatis(持久层)、连接池、Mapper文件

    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】 JavaEE开发需要持久层进行数据库的访问操作。 JDBC MyBatis、Hibernate进行持久开发过程存在大量的代码冗余 Spring基于模板设计模式对与上述的持

    2024年02月05日
    浏览(50)
  • Spring5学习随笔-IOC(反转控制)、DI(依赖注入)和创建复杂对象

    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】 控制:对于成员变量赋值的控制权 反转控制:把对于成员变量赋值的控制权,从代码中反转(转移)到Spring工厂和配置文件中。 好处:解耦合

    2024年02月05日
    浏览(42)
  • Spring5学习随笔-生命周期、自定义类型转换器、后置处理Bean

    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】 指的是一个对象创建、存活、消亡的一个完整过程 由Spring负责对象的创建、存活、销毁,了解生命周期,有利于我们使用好Spring为我们创建

    2024年02月05日
    浏览(68)
  • @ComponentScan注解的实现,Spring扫描包的过程

    相信接触过spring做开发的小伙伴们一定使用过@ComponentScan注解 @ComponentScan指定basePackage,将包下的类按照一定规则注册成Bean。 但是这个注解的其他参数,比如excludeFilters、includeFilters以及底层扫描的实现你有没有了解过? 当我们使用@ComponentScan没有指定excludeFilters、includeFilte

    2024年04月24日
    浏览(30)
  • Spring Boot 中的 @ComponentScan 注解是什么,原理,如何使用

    在 Spring Boot 中,@ComponentScan 是一种注解,它可以让 Spring 自动扫描指定的包及其子包中的组件,并将这些组件自动装配到 Spring 容器中。本文将介绍 @ComponentScan 的原理以及如何在 Spring Boot 中使用它。 在 Spring 中,组件是指那些被 Spring 管理的对象,比如 Bean、Controller、Servic

    2024年02月11日
    浏览(46)
  • Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))

    开篇: 欢迎再次来到 Spring 5 学习系列!在这个博客中,我们将深入研究 Spring 框架的AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式)。 概念 什么是AOP (1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得 业务逻辑各部分之间的

    2024年01月24日
    浏览(48)
  • Spring Boot学习随笔- 实现AOP(JoinPoint、ProceedingJoinPoint、自定义注解类实现切面)

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 问题 现有业务层开发存在问题 额外功能代码存在大量冗余 每个方法都需要书写一遍额外功能代码不利于项目维护 Spring中的AOP AOP:Aspect 切面 + Oriented 面向 Programmaing 面向切面编程 Aspect(切面) = Advice(通知) + Pointcut(

    2024年02月04日
    浏览(48)
  • Spring Boot学习随笔- 集成JSP模板(配置视图解析器)、整合Mybatis(@MapperScan注解的使用)

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 在main创建webapp,然后创建index.jsp进行测试,在访问之前需要进行一个设置,否则springboot是找不到jsp页面的 修改jsp无需重启应用 数据库访问框架:hibernate、jpa、mybatis【主流】 SpringBoot(微框架) = Spring(工厂) + SpringMV

    2024年02月05日
    浏览(50)
  • spring复习:(55)注解配置的情况下@ComponentScan指定的包中的组件是怎么被注册到容器的?

    配置类: 主类: 结论:是在context.refresh()处完成扫描和注册的。 fresh()的代码片段如下: 其中调用的invokeBeanFactoryPostProcessor代码如下: 其中调用的静态方法invokeBeanFactoryPostProcessors代码如下: 其中包含如下代码片段: invokeBeanDefinitionRegisteyPostProcessor的代码如下: 其中调用的

    2024年02月15日
    浏览(41)
  • Spring IOC @Configuration注解分析

    在使用SpringBoot开发时,最常用的注解有@Component、@Service、@Controller、@Configuration等。当类使用这些注解标记时,类会被Spring IOC容器管理,包括创建,填充属性和实例化。 但是Spring容器如何发现并将这些类放到容器进行管理呢? 今天这篇博客主要分析Spring如何处理@Configuratio

    2024年02月08日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包