Spring注解开发

一,注解开发定义Bean

image-20240628222546955

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

image-20240628222610483

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

二,纯注解开发定义Bean

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

image-20240628223931887

image-20240628224006406

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环境中,了解)

image-20240628224514527


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

2.1.3 Bean的生命周期

image-20240628224524737

@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 根据类型自动装入

image-20240629095909087

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

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

image-20240629100249738


2.2.2 注入配置文件的内容

image-20240629100704732


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

image-20240629100717772

也可以注入数组,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

image-20240629102044855

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

image-20240629102134846

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

image-20240629102209629

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

image-20240629102246509

2.3.2 为第三方Bean注入资源

image-20240629102722396

image-20240629102733051

这个注入是默认根据类型注入的,如果存在两个相同的类型,我们就需要在形参前面加上@@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;
   }
posted @ 2024-06-30 15:10  wdadwa  阅读(24)  评论(0)    收藏  举报