@autowired注解 抽象类_Spring容器注解注入
本节主要学习Spring容器核心DI/IOC使用注解方式进行开发。
1.组件注解
组件注解主要包括@Component,@Repository,@Service,@Controller四种。其中@Component是通用型组件,其他三个组件注解,是按照分层的思想,拆分成三个专业型组件:持久化层组件@Repository,服务层组件(业务逻辑层组件)@Service,控制层组件@Controller。
组件注解的注意事项如下:
1.四个组件注解,要放在接口的实现类上,而不是接口或抽象类
2.四个组件注解,都可以使用默认命名,也可以自定义命名,以@Component为例:
@Componentpublic class User { ... }@Componentpublic class UserType { ... }@Component("user")public class User { ... }@Component("userType")public class UserType { ... }
3.四个组件注解可以相互替换。在分层架构的系统中,推荐使用专业组件
4.当一个类不确定是哪一层代码,推荐使用通用组件注解@Component
5.注解标识的组件和配置文件中的组件是等效的,它们可以相互调用
1.1 @Component注解
此注解是泛指,标记为通用型组件,相当于spring配置文件中的,标注在具体实现类上面。
//@Component@Component("role")public class Role { @Value("2000") private Integer id; @Value("dev") private String name;}
1.2 @Repository注解
持久化层组件注解,应用于DAO层具体实现类上,生成持久化对象。
package raky.train.dao.impl;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Repository;import raky.train.dao.UserDao;import raky.train.entity.User;@Slf4j@Repositorypublic class UserDaoImpl implements UserDao { @Override public int save(User user) { //模拟保存数据库 log.info("===UserDaoImpl==user====>{}",user); return 0; }}
1.3 @Service注解
服务层组件注解,应用于Service层具体实现类上,生成业务对象。
package raky.train.service.impl;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Service;import raky.train.dao.UserDao;import raky.train.entity.User;import raky.train.service.UserService;import javax.annotation.Resource;@Slf4j@Servicepublic class UserServiceImpl implements UserService {// @Autowired// @Qualifier("userDaoImpl") @Resource(name = "userDaoImpl") private UserDao userDao; @Override public int save(User user) { log.info("===service==user====>{}",user); return userDao.save(user); }}
1.4 @Controller注解
控制层组件注解,应用于Controller层具体实现类上,生成控制类对象。此注解一般特指用在Spring MVC的控制层组件上。
package raky.train.controller;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import raky.train.entity.User;import raky.train.service.UserService;@Slf4j@Controllerpublic class UserController { @Autowired private UserService userService; @Resource private User user; public int save(){ log.info("=====controller====>service : {}",userService); log.info("===controller==user====>{}",user); return userService.save(user); }}
2.注入注解
注入注解,可以自动注入spring工厂中已经创建的bean实例,无论是通过配置文件,还是组件注解生成的对象。它的作用相当于配置文件中的ref,即引用其他的bean。
@Resource和@Autowired的优先级顺序不同,另外@Resource属于 Jakarta EE规范,而@Autowired属于Spring范畴,@Resource无法使用在构造参数中,@Autowired支持required属性。从面向对象来说,@Resource更加适用于多态性的细粒度注入,而@Autowired更多专注于多态的单例注入。
2.1 @Autowired注解
此注解是Spring提供,标注在属性(字段)、setter方法、构造方法上,默认会按照类型(byType)自动装配属性或参数。该注解,可以自动装配接口的实现类,但前提是一个接口在spring容器中只有一个实现类的bean,多个bean会报错。这时需要添加@Qualifier注解,按照bean的名称匹配。
@Autowired注解
@Componentpublic class User { //标注在属性(字段)上 //@Autowired private Role role; //标注在构造方法上 //@Autowired public User(Role role){ this.role = role; } //标注在setter方法上 @Autowired public void setRole(Role role) { this.role = role; }}
2.2 @Resource注解
此注解属于JSR-250规范的一个注解,包含Jakarta EE(JavaEE)中,spring支持该注解。使用标注在属性(字段)、setter方法上。默认情况下,按照名称注入(byName),如果没有显式声明名称则按照变量名称或者方法中对应的参数名称进行注入,也可以按照名称注入(byType)。
@Resource注解
@Componentpublic class User { //标注在属性(字段)上 //@Resource //@Resource(name = "role") 按照组件名称注入 //@Resource(type = Role.class) 按照组件类型注入 private Role role; //标注在setter方法上 @Resource //@Resource(name = "role") 按照组件名称注入 //@Resource(type = Role.class) 按照组件类型注入 public void setRole(Role role) { this.role = role; }}
3.其他注解
3.1 @Value注解
此注解主要是为类属性/字段赋值。
@Componentpublic class User { @Value("1000") private Integer id; @Value("raky") private String name; //getter and setter}
3.2 @Qualifier注解
此注解主要是确定注入具体组件(多个实现选择具体组件),标注在属性或setter方法上面。
//接口public interface UserDao { int save(User user);}//接口实现1==>保存数据库@Repositorypublic class UserDaoImpl implements UserDao {//...}//接口实现2==>保存成文件@Repositorypublic class UserDaoImpl2 implements UserDao {//...}@Servicepublic class UserServiceImpl implements UserService { @Autowired @Qualifier("userDaoImpl") private UserDao userDao;}
3.3 @Scope注解
此注解主要标注在类或方法上面,确定工厂生成的实例对象的作用范围。取值范围主要有:
singleton 单例模式,生成一个实例/对象
prototype 原型模式,调用一次,生成一次对象
request 请求作用域(web端)
session 会话作用域(web端)
application 应用程序作用域(web端)
websocket web套接字作用域(web端)
@Scope//@Scope("singleton")@Component("role")public class Role { @Value("2000") private Integer id; @Value("dev") private String name;}
3.4 @Primary注解
此注解标注在类上面,确定优先选择具体实现对象实例。
//接口public interface UserDao { int save(User user);}//接口实现1==>保存数据库@Primary@Repositorypublic class UserDaoImpl implements UserDao {//...}//接口实现2==>保存成文件@Repositorypublic class UserDaoImpl2 implements UserDao {//...}@Servicepublic class UserServiceImpl implements UserService { @Autowired private UserDao userDao;}
3.5 @Configuration注解
此注解告诉spring容器这是一个配置类,相当于一个spring的配置文件
@Configuration==beans.xml
package raky.train.config;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import raky.train.controller.UserController;import raky.train.entity.Group;@Slf4j@Configuration@ComponentScan(basePackages = {"raky.train"})public class AppConfig { private static ApplicationContext context; @Bean public Group getGroup(){ return new Group(1000,"king"); } public static void main(String[] args) { //通过注解配置获取spring工厂 context = new AnnotationConfigApplicationContext(AppConfig.class); Group group = context.getBean(Group.class); log.info("======>group : {}", group); }}
3.6 @Bean注解
该注解告诉 Spring,一个带有 @Bean 的注解方法将返回一个对象,该对象应该被注册为在 Spring 应用程序上下文中的 bean。给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id。
@Bean 等价于 ,可以给@Bean设置value来修改id,比如@Bean("userAlias")
可以在@bean中指定初始化和销毁方法,如下代码:
@Bean(value = "beanLife",initMethod = "init", destroyMethod = "destroy")//等价于
4.注意事项
4.1 接口与实现
一个接口只有一个实现,注入注解@Autowired/@Resource没有问题,唯一实现;
一个接口有多个实现,依赖注入必须进行区分,否则会报错NoUniqueBeanDefinitionException;
第一种:指定具体名称@Resource(name = "userDaoImpl")
第二种:设置优先级 @Primary
第三种:@Autowired和@Qualifier("userDaoImpl")配合使用
4.2 组件注入/装配模式
组件装配模式,即按照什么样的方式来装配组件,在配置文件中进行设置,具体的值有:no 没有; default 默认注入方式;byName 按照名称注入;byType 按照类型注入;constructor 按照构造器注入。
想学习Spring容器其他注入方式,请查看我的学习笔记:《Spring容器6种注入方式》。
至此,Spring容器核心DI/IOC使用注解方式进行开发的学习笔记整理完毕。希望对大家有帮助。越分享越快乐。
@autowired注解 抽象类_Spring容器注解注入相关推荐
- java常用注解汇总_Spring常用注解汇总
概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...
- autowired java配置_Spring自动注解标签@Autowired不能注入xml配置的bean吗?
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 配置service的xml service代码 public class LoginServiceImpl extends BaseDaoServiceI ...
- java spring aop 注解包_Spring AOP 注解配置实例
Spring AOP注解例子 一:导入相关jar包. 首先导入Spring的相关包(这里就不多说了,我这里是3.2.4版本的) 然后导入AOP注解的相关包(不是spring的包)aspectjrt-1 ...
- @autowired注解 抽象类_别再用ifelse了,用注解去代替他吧
来自公众号:咖啡拿铁 策略模式 经常在网上看到一些名为"别再if-else走天下了","教你干掉if-else"等之类的文章,大部分都会讲到用策略模式去代替if ...
- @autowired注解原理_Spring框架第二谈:IOC,xml配置文件给属性赋值,注解实现赋值...
在spring的对象文件中,给Java对象的属性赋值: di依赖注入,表示创建对象,给属性赋值di的实现方法有两种:1.在spring的配置文件中,使用标签完成,叫做基于XML的di实现2.使用spr ...
- Spring→简介核心作用范围、框架、接口编程、IOC控制反转、单元测试、Bean容器、注入、作用域、生命周期、自动装配注入、自动扫描@注解
官网 https://spring.io/ 文档 https://spring.io/projects/spring-framework Spring框架 框架 接口 IOC控制反转 单元测试 Bea ...
- @retention注解作用_Spring 最核心的注解,都是干货!
Spring中的注解大概可以分为两大类: spring的bean容器相关的注解,或者说bean工厂相关的注解: springmvc相关的注解. spring的bean容器相关的注解有:@Require ...
- cacheable 表达式_Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...
- 【Spring】IOC:基于注解的IOC容器初始化源码分析
从 Spring2.0 以后的版本中,Spring 也引入了基于注解(Annotation)方式的配置,注解(Annotation)是 JDK1.5 中引入的一个新特性,用于简化 Bean 的配置,可 ...
- spring @Autowire 的注解默认是按类型注入bean
spring @Autowire 的注解默认是按类型注入bean,比如下面这个类 import javax.sql.DataSource; import org.springframework.bea ...
最新文章
- 团队成员怎样进行工作汇报?
- 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
- 汇编语言-第四章 第一个程序
- 硬件安全(二) 5G时代IOT环境下芯片安全风险与挑战
- About SCCM 2012 UDA(User Device Affinity)
- [HDU 6643] Ridiculous Netizens(点分治+根号分治+dp)
- linux sshd进程起不来,linux sshd服务异常
- php while for 性能,PHP For While 循环
- 在哪里学python-为什么要选择学python,亮点在哪呢?
- Arrays.asList 方法注意事项
- 能否设计变容量发动机
- 浙大版c语言程序设计第三版邀请码,浙大版《C语言程序设计(第3版)》题目集 习题9-5 通讯录排序...
- 存储过程和函数的区别
- 在谷歌浏览器上播放rtmp视频的坑
- 内网环境下element-template配置element-admin
- 期末|研究生英语写译教程(提高级/第三版)课后练习答案
- ME:环境DNA(eDNA)宏条形码技术正在转变我们考察动植物群落的方法
- 【每周CV论文推荐】初学基于GAN的三维图像生成有哪些经典论文需要阅读
- body英语什么意思是什么_body是什么意思
- android 菜单一行两列,Android RadioGroup 横向显示(两行两列)
热门文章
- 如何选择适合自己的相机?
- python 字符串以及通过dos命令运行py脚本
- leapmotion手势交互引擎
- 互联网创业原则与创业模式attilax大总结
- Atitit J2EE平台相关规范--39个 3.J2SE平台相关规范--42个
- paip.提升性能---jvm java 工具使用.
- paip. C#.NET循环获取不同随机数的方法根据时间
- System.Transactions.Diagnostics.DiagnosticTrace 的类型初始值设定项引发异常。配置系统未能初始化
- 大型基金电商多点开花 中小公司望洋兴叹
- (转)Python之区块链入门