网站Logo 苏叶的belog

Spring注解开发

wdadwa
3
2026-03-30

一,注解开发定义Bean

2953321-20240628222546222-76816984.png

如果不给名字,那么获取 bean 只能通过类型获取了。

2953321-20240628222609144-668018463.png

@Repository 用的很少,因为基本上是整合 mybatis 进行开发的,故用 @Mapper 代替这个的注解的更多哦。

二,纯注解开发定义Bean

Spring3.0 升级了纯注解开发模式,使用 java 类替代配置文件,开启了 Spring 快速开发赛道。

2953321-20240628223930784-1900509453.png

2953321-20240628224005054-1878738172.png

2.1 Bean的管理(注解版)

2.1.1 获取Bean

默认情况下,Spring 项目启动时,会把 bean 都创建好放在 IOc 容器中,如果想要主动获取这些 bean,从ApplicationContext类中提供了如下方法获取 bean

  • 根据 name 获取 bean

    Object getBean(String name)
    
    
  • 根据 type 获取 bean

    <T> T getBean(Class<T> requireType)
    
    
  • 根据 name 获取 bean(附带类型转换)

    <T> T getBean(String name, Class<T> requireType)
    

2.1.2 Bean的作用范围

Spring 支持五种作用域,后三种在 web 环境才生效:

作用域说明
singleton容器内同名称的bean只有一个实例(单例)(默认)
prototype每次使用该bean时会创建新的实例(非单例)
request每个请求范围内会创建新的实例(web环境中,了解)
session每个会话范围内会创建新的实例(web环境中,了解)
application每个应用范围内会创建新的实例(web环境中,了解)

2953321-20240628224512951-1032037801.png


Bean 默认是在 Spring 项目启动的时候就实例化了,但是 Spring 提供了当 bean 第一次使用的时候才开始实例化,这种叫延迟初始化,使用方法是在 Bean 类的上方加上@Lazy注解即可

2.1.3 Bean的生命周期

2953321-20240628224523329-388996961.png

@PostConstruct 和 @PreDestroy 注解位于 java.xml.ws.annotation 包是 Java EE 的模块的一部分。J2EE 已经在 Java 9 中被弃用,并且计划在 Java 11 中删除它。

解决方法:添加依赖:

   <dependency>
     <groupId>javax.annotation</groupId>
     <artifactId>javax.annotation-api</artifactId>
     <version>1.3.2</version>
   </dependency>

2.2 依赖注入(注解版)

2.2.1 根据类型自动装入

2953321-20240629095910274-894188841.png

我们可以向上述代码一样将 @Autowired 直接加在属性上方进行依赖注入,也可以加在set 方法,构造方法上方进行依赖注入。

我们也可以按照 bena 的名字进行依赖注入:

2953321-20240629100250131-1244033092.png


2.2.2 注入配置文件的内容

2953321-20240629100705163-352616401.png


注入配置文件,我们需要先,加载 Properties 文件,将数据注入

2953321-20240629100718196-1174076783.png

也可以注入数组,List,Set,只需要在配置文件中按照正常的写法即可。

name=t1,t2,t3,t4
private class di{
   @Value("${name}")
	private List<String> names;
}

2.2.3 根据bean的名字自动装入

@Resource 是 Java 中用于依赖注入的注解,主要由 JSR-250 规范定义。它通常用于 Java EE 环境,但在 Spring Framework 中也可以使用。@Resource 注解主要用于注入一个外部资源,例如 Bean、类、或者其它资源,功能类似于 Spring 的 @Autowired 注解,但有一些区别。

  • 基本用法:

    import javax.annotation.Resource;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyService {
        
        @Resource
        private AnotherService anotherService;
        
        // 业务逻辑方法
    }
    
  • 可以使用 name 属性来指定要注入的 Bean 的名称:

    import javax.annotation.Resource;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyService {
        
        @Resource(name = "specificService")
        private AnotherService anotherService;
        
        // 业务逻辑方法
    }
    
  • 还可以使用 type 属性来指定要注入的 Bean 的类型:

    import javax.annotation.Resource;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyService {
        
        @Resource(type = AnotherService.class)
        private AnotherService anotherService;
        
        // 业务逻辑方法
    }
    

2.2.4 两个注入注解的区别

按名称 vs. 按类型:

  • @Resource 默认按名称注入,可以通过 name 属性指定 Bean 名称。
  • @Autowired 默认按类型注入,如果有多个相同类型的 Bean,可以结合 @Qualifier 注解按名称注入。

JSR-250 标准 vs. Spring 特有:

  • @Resource 是 JSR-250 标准的一部分,适用于 Java EE 环境和 Spring。
  • @Autowired 是 Spring 特有的注解,仅适用于 Spring 环境。

Optional 属性:

  • @Autowired 可以通过 required 属性指定是否为必需依赖,默认是 true。设置为 false 时,可以避免 NoSuchBeanDefinitionException 异常。
  • @Resource 没有 required 属性,但在 Spring 中,如果找不到对应的 Bean,也会抛出 NoSuchBeanDefinitionException 异常。

2.3 第三方Bean管理

2.3.1 管理第三方Bean

2953321-20240629102045721-1783109155.png

不推荐直接在 Spring 配置类中配置三方 Bean,这样会导致代码臃肿。推荐如下,单独抽取出来管理三方 Bean

2953321-20240629102135408-922258354.png

然后我们有两种方式让配置生效:

2953321-20240629102209973-1031427271.png

推荐使用导入式,这样能一眼看出配置类的结构信息,使用扫描式会导致代码不清晰,不知道这个配置具体有什么。

2953321-20240629102247112-1111019780.png

2.3.2 为第三方Bean注入资源

2953321-20240629102723070-892336578.png

2953321-20240629102733255-880355909.png

这个注入是默认根据类型注入的,如果存在两个相同的类型,我们就需要在形参前面加上 @@Qualifier 来指定

   @Bean
   public DataSource getDataSource(@Qualifier("userDao") IUseDao dao) {
       dao.saveUser();
       DruidDataSource ds = new DruidDataSource();
       ds.setDriverClassName(driverName);
       ds.setUrl(url);
       ds.setUsername(username);
       ds.setPassword(password);
       return ds;
   }
动物装饰