【Spring5】基于注解的Bean管理简直是Spring中的Spring(上)

简介: 文章目录1 什么是注解2 基于注解方式实现对象的创建3 组件扫描配置的细节4 基于注解实现属性的注入4.1 几种注解概述4.2 @Autowire注解演示4.3 @Qualifier注解演示4.4 @Value注解演示5 纯注解的开发模式写在最后

1 什么是注解

注解是代码中特殊的标记,格式如下:


@注解名称(属性名称=属性值,属性名称=属性值......)
1

注解可以作用在类、方法、属性上,在上一节中,我们对IOC与解耦合有了深刻的理解,并对基于xml配置的方式操作Bean也有了一定认识。可以体会到,当bean足够多时,配置xml就会变得很麻烦!而使用注解的目的就是为了能够简化xml配置。


Spring针对Bean管理中创建对象提供注解, 以下四个注解都可以用来创建bean实例,只是为了便于开发者清晰区分当前层:

(1)@Component

(2)@Service

(3)@Controller

(4)@Repository


2 基于注解方式实现对象的创建

Demo演示:

1.引入依赖, 除了上节IOC操作中的四个jar包以外,还需要导入spring-aop-5.2.6.RELEASE.jar ,文末提供相关资源下载链接。


2.导入名称空间


3.开启组件扫描: 告诉Spring容器哪些类需要使用注解。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context  http://www.springframework.org/schema/beans/spring-context.xsd">
    <!--开启组件扫描-->
    <!--
        1.扫描多个包 可以用逗号隔开
        2.也可以扫描上层目录
    -->
    <context:component-scan base-package="com.ithxh.spring5"></context:component-scan>
</beans>

4.创建类,并添加注解。 注解中的Value值可以省略,若省略,默认为类名首字母小写的值。


import org.springframework.stereotype.Component;
/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 */
@Component(value = "userService") //<bean id="userService" class="..."/>
public class UserService {
    public void doAnyThing(){
        System.out.println("doing...");
    }
}

5.尝试调用方法。

public class TestDemo {
    @Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        userService.doAnyThing();
    }
}


3 组件扫描配置的细节

可以对组件扫描进行个性化配置。


示例一:设置扫描的内容

<context:component-scan base-package="com.ithxh.spring5" use-default-filters="false">
  <context:include-filter type="annotation" 
                            expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

use-default-filters=“false”表示不使用默认filters,默认情况下是扫描当前基本包下所有类的注解。

context:include-filter,用于设置扫描哪些内容。

示例一中的代码表示扫描com.ithxh.spring5下包的类中Controller注解内容。


示例二:设置不扫描的内容

<context:component-scan base-package="com.ithxh.spring5">
  <context:exclude-filter type="annotation"
                            expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

示例二中默认扫描当前包下所有内容,但是 context:include-filter,用于设置不扫描哪些内容, 因此,不会扫描Controller注解内容。


4 基于注解实现属性的注入

4.1 几种注解概述

针对对象类型的注入相关注解如下:


  • @Autowired:根据属性类型进行自动装配。
  • @Qualifier:根据属性名称进行注入。通过设置value属性值。
  • @Resource:可以根据类型,可以根据名称注入。如果设置了name属性值,则是根据名称注入。但是与前两种的区别是,该注解是在javax扩展包中的,因此Spring更推荐使用前两种注解。

注入普通类型的相关注解:


@Value:注入普通属性。

4.2 @Autowire注解演示

@Autowired 注解Demo演示


0.准备!创建UserService、UserDao、UserDaoImpl,其中UserDaoImpl是UserDao接口的实现类

1.完成UserService和UserDao对象的创建,在两个类上添加注解。

2.在UserService中添加UserDao类型属性,并在该属性上使用注解完成在service注入dao对象。

需要注意,不要给多个Dao实现类添加注解,否则自动装配会引发异常!Spring并不知道该给哪个类进行装配(类型相同)

(我帮你试过了,害不害怕!先往下看,解决方法一会儿说)


完整代码及测试如下:

UserService.java

import com.ithxh.spring5.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
    @Autowired
    private UserDao userDao;
    public void doAnyThing(){
        System.out.println("UserService doing...");
        userDao.add();
    }
}

UserDao.java

public interface UserDao {
    public void add();
}

相关文章
|
9天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
28 0
|
28天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
12天前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
16天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
41 4
SpringBoot必须掌握的常用注解!
|
18天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
58 2
|
18天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
33 1
|
1月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
13天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
10 0
|
1月前
|
XML Java 数据库
Spring boot的最全注解
Spring boot的最全注解