【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的参数相当于
//规范写法
//@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方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?