java~spring-ioc的使用
spring-ioc的使用
IOC容器在很多框架里都在使用,而在spring里它被应用的最大广泛,在框架层面
上,很多功能都使用了ioc技术,下面我们看一下ioc的使用方法。
- 把服务注册到ioc容器
- 使用属性注入反射对应类型的实例
- 多态情况下,使用名称反射类型的实例
把服务注册到ioc容器
- @Bean注册组件
使用@Bean注解进行类型的注册,默认你的ioc容器里类型为bean的返回值,名称为bean所有的方法名,与
你的包名称没有直接关系,如果你的接口有多种实现,在注册时可以使用@Bean("lind")这种方式来声明。
- @Component,@Configuration,Service,Repository注册组件
这几个注解都是在类上面声明的,而@Bean是声明在方法上的,这一点要注意,这几个注解一般是指对一个
接口的实现,在实现类上加这些注解,例如,一个数据仓储接口UserRepository,它可以有多种数据持久
化的方式,如SqlUserRepositoryImpl和MongoUserRepositoryImpl,那么在注册时你需要为他们起
一个别名,如@Repository("Sql-UserRepositoryImpl) SqlUserRepositoryImpl,默认的名称是
类名,但注意类名首字母为小写。
public interface EmailLogService {
void send(String email, String message);
}
@Component()
public class EmailLogServiceHttpImpl implements EmailLogService {
private static final Logger logger = LoggerFactory.getLogger(EmailLogServiceHttpImpl.class);
@Override
public void send(String email, String message) {
Assert.notNull(email, "email must not be null!");
logger.info("send email:{},message:{}", email, message);
}
}
@Component("email-socket")
public class EmailLogServiceSocketImpl implements EmailLogService {
private static final Logger logger = LoggerFactory.getLogger(EmailLogServiceSocketImpl.class);
@Override
public void send(String email, String message) {
Assert.notNull(email, "email must not be null!");
logger.info("send email2:{},message:{}", email, message);
}
}
// 看一下调用时的测试代码
@Resource(name = "email-socket")
EmailLogService socketEmail;
@Autowired
@Qualifier( "emailLogServiceHttpImpl")
EmailLogService httpEmail;
@Test
public void testIoc2() {
socketEmail.send("ok", "ok");
}
@Test
public void testIoc1() {
httpEmail.send("ok", "ok");
}
在程序中使用bean对象
使用Resource装配bean对象
在通过别名调用bean时,你可以使用@Resource注解来装配对象使用@Autowired装配bean对象
也可以使用 @Autowired
@Qualifier( "emailLogServiceHttpImpl")两个注解去实现程序中的多态。
使用场景
在我们有些相同行为而实现方式不同的场景中,如版本1接口与版本2接口,在get方法实现有所不同,而这
两个版本都要同时保留,这时我们需要遵守开闭原则,扩展一个新的接口,而在业务上对代码进行重构,
提取两个版本相同的方法到基类,自己维护各自独有的方法,在为它们的bean起个名字,在装配时,通过
bean的名称进行装配即可。
写个伪代码:
class Api_version1(){
@Autowired
@Qualifier("print-version1")
PrintService printService;
}
class Api_version2(){
@Autowired
@Qualifier("print-version2")
PrintService printService;
}
class BasePrintService{}
interface PrintService{}
@Service("print-version1")
class PrintServiceImplVersion1 extends BasePrintService implements PrintService{}
@Service("print-version2")
class PrintServiceImplVersion2 extends BasePrintService implements PrintService{}
好了,这就是大叔总结的关于spring-ioc的一种东西!
java~spring-ioc的使用的更多相关文章
- Java Spring IOC用法
Java Spring IOC用法 Spring IoC 在前两篇文章中,我们讲了java web环境搭建 和 java web项目搭建,现在看下spring ioc在java中的运用,开发工具为In ...
- [Java]Spring Ioc讲解,不怕你不懂
原文地址 引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义 ...
- Java Spring AOP用法
Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...
- Spring IOC 方式结合TESTGN测试用例,测试简单java的命令模式
java命令模式: 可以命令("请求")封装成一个对象,一个命令对象通过在特定的接收着上绑定一组动作来封装一个请求.命令对象直接把执行动作和接收者包进对象中,只对外暴露出执行方法的 ...
- Spring IOC之基于JAVA的配置
基础内容:@Bean 和 @Configuration 在Spring中新的支持java配置的核心组件是 @Configuration注解的类和@Bean注解的方法. @Bean注解被用于表明一个方法 ...
- J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP
J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP 前言 搜狐畅游笔试题中有一道问答题涉及到回答谈谈对Spring IOC与AOP的理解.特将相关内容进行整理. ...
- Java Spring Boot VS .NetCore (三)Ioc容器处理
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- Spring IOC知识java反射
[1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http: ...
- 【小家Spring】Spring IoC是如何使用BeanWrapper和Java内省结合起来给Bean属性赋值的
#### 每篇一句 > 具备了技术深度,遇到问题可以快速定位并从根本上解决.有了技术深度之后,学习其它技术可以更快,再深入其它技术也就不会害怕 #### 相关阅读 [[小家Spring]聊聊Sp ...
- [Java复习] Spring IoC
1. Spring bean的生命周期? 1. 对Bean进行实例化(相当于new) 对于BeanFactory 当客户向容器请求一个尚未初始化的bean(或初始化bean需要注入另外一个尚未初始化的 ...
随机推荐
- php 按月创建日志
public function log($log_string){ //$_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR."files". ...
- BZOJ3592 : Architext
首先特判多边形面积$=0$的情况,此时内部没有点,答案只会在顶点处取到. 对于面积$>0$的情况,离线询问,将所有多边形合在一起得到平面图,然后求出对偶图,那么每条多边形边的两侧分别对应对偶图中 ...
- using Sysyem.Net.Http命名空间引用不了的解决方案
1.查看.Net Framework的框架是否是在4.5之上,如果不是要下载4.5之上的目标框架. 2.在引用器里面添加using System.Net.Http命名空间 选择项目列表中的“引用”-- ...
- Android Architecture Components--项目实战
转载请注明出处,谢谢! 上个月Google Android Architecture Components 1.0稳定版发布,抽工作间隙写了个demo,仅供参考 Github地址:https://gi ...
- 2019中山大学程序设计竞赛-Monitor
题目地址 题目大意:给你一个n*m的矩形,在这个矩形内告诉你p个矩形(左下角和右上角坐标),问你q个问题,每次也是给你一个矩形(左下角和右上角坐标),问你每个矩形是否可以被开始给的p个矩形完全覆盖. ...
- 解决Django+Vue前后端分离的跨域问题及关闭csrf验证
前后端分离难免要接触到跨域问题,跨域的相关知识请参:跨域问题,解决之道 在Django和Vue前后端分离的时候也会遇到跨域的问题,因为刚刚接触Django还不太了解,今天花了好长的时间,查阅了 ...
- 【CSS 第六天】三种简历
1.盒子模型 2.三种简历 利用float和CSS制作内容一致,但是样式不一致的三种简历. 代码 3.效果 style-1 3.2效果2 效果三
- 封装一个 员工类 使用preparedStatement 查询数据 (1)
创建员工类 自动生成get set 方法 package cn.hph; public class emp { //定义表中的属性 private int id; private String en ...
- 深入解析Java反射基础
博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...
- webapi 知识点
在web api 中后台的方法必须 加入 [HttpGet] ,[HttpPost],[HttpPut],[HttpDelete] 来区分,这是一种习惯. ps: get 方式参数都存在http协议头 ...