【Spring 框架(自学)】Day04(基于注解的DI)--2022/3/26

基于注解的DI(重点)

使用注解的步骤:

  • 加入maven依赖项 spring-context,它会间接加入spring-aop的依赖
  • 在类中加入spring的注解(多个不同功能的注解)
  • 在spring的配置中,加入一个组件扫描器的标签,说明注解在你的项目中的位置

学习的注解:

1.@Component

2.@Respotory

3.@Service

4.@Controller

5.@Value

6.@Autowired

7.@Resource


@Component注解

放在实体类上面,其作用是给实体类创建对象,相当于Spring配置文件中的标签

如:

其中value的参数相当于标签中的id字段,且@Component创建的对象在Spring中是唯一的

//规范写法
//@Component(value="myStudent")

//省略value写法
@Component("myStudent")

//无参写法
/*
	当参数省略时,Spring自己默认创建对象,其对象名为实体类小写字母开头:student
*/
//@Component
public class Student{
    private String name;
    private Integer age;
    
    //无参构造{}
    //Setter方法()
    //toString方法()
}

在Spring中呢,跟@Component的功能一样,创建对象的注解,但作用域不一样的有:

  • @Repository(作用于Dao层):放在Dao的实现类上面,表示创建Dao对象,方便访问数据库
  • @Service(作用于业务层):放在Service的实体类上面,表示创建Service对象,方便业务处理,可以有事务等功能
  • @Controller(作用于控制层):放在Controller的实体类上面,表示创建Controller对象,方便接受用户的参数,显示请求的处理结果

@Repository、@Service、@Controller都是给项目的对象分层的

当没有指定具体功能的时候就用@Component注解


组件扫描器:Component-scan

<!--组件扫描器:
		其作用是扫描实体类中用注解创建的对象或给对象的赋值进行扫描
	属性:base-package
			用于扫描实体类中注解所在的包目录
-->
<context:component-scan base-package="xx.yy.包目录"></context:component-scan>

<!--
	指定多个包的三个扫描方式
-->
<!--指定多个包名-->
<context:component-scan base-package="xx.yy.包目录01"></context:component-scan>
<context:component-scan base-package="xx.yy.包目录02"></context:component-scan>

<!--指定多个报名,并用分隔符来分开(;或者,)-->
<context:component-scan base-package="xx.yy.包目录01 ; xx.yy.包目录02">
</context:component-scan>

<!--指定父包-->
<context:component-scan base-package="xx.yy"></context:component-scan>

<!--
	需要注意的是:
		拥有多个方法去指定多个包的时候,一定要考虑效率问题(时间)
-->

拥有多个方法去指定多个包的时候,一定要考虑效率问题(时间)


@Value注解

用于给简单类型的属性赋值,其(Value="")属性是用来给简单类型的属性传参,也可以将其属性省略

作用域:

  • 放在属性上面,可以省略Setter方法,也是推荐使用的
  • 放在Setter方法上面,但是要定义Setter方法
@Component("myStudent")
public class Student{
    @Value("张三")
    private String name;
    private Integer age;
    
    @Value("29")
    public void setAge(Integer age) {
        this.age = age;
    }
}

@Autowired和@Qualifier注解

@Autowired和@Qualifier都是用于给引用类型的属性赋值,唯一的不同是:

  • @Autowired默认使用的是byType,等同于根据bean标签中的class属性寻找
  • @Qualifier默认使用的是byName,等同于根据bean标签中的id属性寻找
  • 其位置可以在属性上面或者setter方法上面

@Qualifier中的value属性可以省略

@Component("myStudent")
public class Student{
    @Value("张飞")
    private String name;
    @Value("29")
    private Integer age;
    
    @Autowired
    @Qualifier("mySchool")//二者要一起使用
    private School school;
    
    //toString方法()
}
@Component("mySchool")
public class School {
    @Value("byName注解")
    private String name;
    @Value("武汉")
    private String address;

    @Override
    public String toString() {
        return "School{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

@Autowired中required属性:

required属性中,值只有true或false

  • 当引用类型赋值失败时,required的值默认会为true,并报错终止程序的执行
  • 当引用类型赋值失败时,required的值可以手动调整为false程序正常执行,但引用类型为null

JDK注解@Resource自动注入

@Resource也是给引用类型的属性赋值的,不过是JDK自带的,而Spring则是引用其JDK注解的功能

@Component("myStudent")
public class Student{
    private String name;
    private Integer age;
    @Resource
    private School school;
}
@Component("myStudent")
public class Student{
    private String name;
    private Integer age;
    @Resource(name = "bean标签的id名")
    private School school;
}

@Resource有两种用法:

  • 默认@Resource,当注解为此状态时,默认会执行byName方法如果找不到,则会使用byType
  • @Resource(name = "bean标签的id名"),此方法会让其只使用byName方法

posted @   VVS,冷漠的心  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

囚鸟该如何超越今生?

点击右上角即可分享
微信分享提示