Spring注解的使用和组件扫描
2024-09-01 18:34:29
非常重要】 组件扫描(Component-Scan)
- 通过配置组件扫描,可以使得spring自动扫描package,而不必在spring的配置文件中逐一声明各个
<bean>
- 在配置组件扫描时,指定的包是“根包”,即例如指定了
cn.tedu.spring
,spring不只会扫描这个包,还会扫描它的各个层级子包,例如:cn.tedu.spring.dao
- 直接在spring的配置文件中开启组件扫描即可
<context:component-scan base-package="cn.tedu.spring"></context:component-scan>
- 注意: 仅仅开启组件扫描
spring
是不会自动管理bean的,而是自动的扫描package
,要想自动管理bean,那么还需要配置注解
注解
- 在类的声明上方添加
@Component
注解,可以是的spring知道这个类是一个组件,需要进行管理,所以如过某个类需要被Spring管理,应该将这个类放在被扫描的包中,并且添加注解 - 由Spring扫描到的组件(由
@Component
注解标记的类),会由Spring自动设置Bean Id
,值为将类名首字母小写的名称,例如组件类的名称是UserDao
,则配置的Bean的id是userDao
,如果需要自定义Bean,那么可以直接在注解中设置,比如@Component("id")
前提
- 一定要是在开启组件扫描的包下使用注解,否则将不会扫描到配置的注解
常用注解
- 可以混用,暂时这几个注解没有差异,完全功能相同,但是我们还是要根据规则使用
@Component
: 通用注解@Service
: 用于对业务逻辑类的注解(Service层)@Controller
: 用于对控制器类的注解@Repository
:用于对持久层处理类的注解(Dao层)@Named
:通用注解(不用)- 以上5个注解从实现目标和效果是等效的,但是基于方便理解代码的目的,应该按需使用,了;例如对名为
UserService
类的,应该使用@Service
其他注解
@Scope
- 在类的声明语句上方添加这个注解,用于设置bean的作用域,比如
@Scope("prototype")
表示非单例,默认是单例
@Lazy
- 在单例模式下设置是否懒加载,例如
@Lazy("true")
用于设置成懒加载 - 在类的声明语句上方添加
- 前面之前已经说过,在创建Bean的时候默认使用的是单例模式下的饿汉式的创建,即是在spring配置文件加载的时候创建
@PostConstruct
- 将方法设置为生命周期的初始化方法
- 设置初始化方法,直接在初始化方法的声明语句中添加即可
@PostConstruct
public void init(){
System.out.println("初始化方法");
}
@PreDestroy(单例模式下才会销毁)
- 在方法的声明语句上方使用,可以将这个方法设置为生命周期的销毁方法
@PreDestroy
public void destroy(){
System.out.println("销毁方法");
}
注入值
@Autowired (不推荐使用)
- 在类中,在声明属性的上方添加
@Autowired
,用于标记该属性是自动装配值 - 这种自动装配默认按照类型(
byType
)实现自动装配 - 如果需要按照名称(byName)来自动装配,还需要使用
@Qualifier("userDao")
来组合使用,注解中配置的名称是需要注入的值的Bean-Id
UserDao
@Repository("userDao")
public class UserDaoImpl implements UserDao{
public void reg() {
System.out.println("reg");
}
}
UserService
@Service
public class UserService {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
public void reg(){
userDao.reg();
}
}
@Resource (推荐使用)
- 在需要注入的属性的上方添加该注解
- 默认先按照名称来自动装配的(byName),如果名称对应不上,那么按照类型(byType)进行匹配
@Resource
private UserDao userDao;
- 如果使用
@Resource(name="userDaoImpl")
,name属性指定的是Bean Id
,添加了name属性,那么只是按照名称来装配,如果这个名称对应的Bean不存在,那么就注入失败
@Resource(name="userDaoImpl")
private UserDao userDao;
@Value
- 使用
@Value
注解添加在属性的声明的上方,可以对属性注入值 - 直接注入值
@Value("陈加兵")
private String name;
- 在使用
@Value("#{beanId.属性名}")
的注解时还可以使用Spring表达式
https://cloud.tencent.com/developer/article/1120386
最新文章
- SQL语法
- 15分钟学会使用Git和远程代码库
- 关闭Windows Update更新驱动程序
- GTD时间管理(1)---捕获搜集
- sprint3冲刺团队贡献分-软件工程
- Nginx使用的php-fpm的两种进程管理方式及优化(转)
- 161104、NoSQL数据库:key/value型之levelDB介绍及java实现
- SQL Server中取两个表的交集,并集和差集
- centos下httpd 启动失败的解决办法
- html转换为纯文本,支持撇号
- <;C++Primer>;第四版 阅读笔记 第四部分 “面向对象编程与泛型编程”
- 线段树(hdu 1556)
- 关于在git添加远程地址的过程中遇到的问题
- Web后台快速开发框架
- 「POI2011 R2 Day2」Tree Rotations【线段树合并】
- Canal学习笔记(客户端)
- 【数据库问题】sql server 获取MD5值结果不一致的问题 substring(sys.fn_sqlvarbasetostr(HashBytes(&#39;MD5&#39;,&#39;111111&#39;)),11,32)
- JavaScript绑定this
- VRRP、Track与NQA联动配置举例(Master监视上行链路)
- Python多线程-Barrier(障碍对象)
热门文章
- 【ES6】数值的扩展
- 如何使用charles抓包H5页面内容
- 解读setTimeout, promise.then, process.nextTick, setImmediate的执行顺序
- [译]C# 7系列,Part 5: private protected 访问修饰符
- Winform中使用Timer实现滚动字幕效果(附代码下载)
- Java工作流引擎jflow对流程的结束大总结
- Flutter学习笔记(28)--使用第三方jar包
- RAC修改字符集
- webpack 插件 ProvidePlugin 的使用方法和 eslint 配置
- C语言编程的一些小总结