Spring总结四:IOC和DI 注解方式
首先我们要了解注解和xml配置的区别:
作用一样,但是注解写在Bean的上方来代替我们之前在xml文件中所做的bean配置,也就是说我们使用了注解的方式,就不用再xml里面进行配置了,相对来说注解方式更为简便。
IOC获取对象注解方式:
在我们第二篇(IOC容器配置 xml方式)总结的基础上做修改:
首先我们的applicationContext.xml配置文件要略作修改:(把beans里面加上绿色背景的配置)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd "><!--开启扫描 扫描包com.zy下面的--><context:component-scan base-package="com.zy"></context:component-scan> </beans>
然后我们的JavaBean类加上注解(Component):
@Component("bean1") public class Bean1 {public Bean1() {System.out.println("Bean1的无参构造方法");} }
这样就代替了我们之前在applicationContext.xml中配置的: <bean id="bean1" class="com.zy.IoC.Bean1"></bean>
测试及运行结果请参照总结第二篇,得出的结果是一样的。
Spring 容器还提供@Component 等效三个衍生注解
@Repository 用于注册DAO(持久层 )
@Service 用于注册 Service(业务层)
@Controller 用于注册 Action (表现层)
以@Repository为例:
/*** 测试UserDao接口*/ public interface UserDao {public void getUser(); } /*** UserDao实现类1*/ @Repository("userDao") public class UserDaoImpl implements UserDao {public UserDaoImpl() {System.out.println("dao1 构造方法");}@Overridepublic void getUser() {System.out.println("UserDao实现类1 获取用户信息...");} }
测试:
@Testpublic void getUser() throws Exception {//根据spring配置文件 获取spring容器ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//使用容器创建UserDao的实现类对象 userDao和配置文件中的 bean的id一致UserDao dao = ac.getBean("userDao", UserDao.class);dao.getUser();}
运行结果:
DI依赖注入注解方式:
注解基本类型属性:这个不多做介绍了
// 基本类型属性 @Value("#{'张学友'}") private String name;
注解复杂类型属性:
1,Spring3.0提供@Value注解
// 复杂类型属性// 第一种 @Value 结合 spEL@Value("#{userDao}")private UserDao userDao;
2,Spring2.0 提供@Autowired 注解 结合 @Qualifier 注解
// 第二种 @Autowired 注解 结合 @Qualifier 注解// 如果单独使用@Autowired 默认按照类型注入,如果有多个同一类型的只能找到一个// 使用 @Qualifier 按照名称注入 @Autowired@Qualifier("userDao")private UserDao userDao;
3,JSR-250规范 提供 @Resource 注解实现注入(不推荐使用)
// 第三种 JSR-250提供@Resource 注解// 不写name属性,按照类型注入,写了name属性,按照名称注入@Resource(name = "userDao")private UserDao userDao;
以把UserDao注入到UserService为例:
JavaBean代码:
/*** 测试UserDao接口*/ public interface UserDao {public void getUser(); } /*** UserDao实现类1*/ @Repository("userDao") public class UserDaoImpl implements UserDao {@Overridepublic void getUser() {System.out.println("2 UserDao实现类1 获取用户信息...");} }/*** UserService接口*/ public interface UserService {public void getUser(); } /*** UserService实现类*/ @Service("userService") public class UserServiceImpl implements UserService {//@Autowired+@Qualifier的方式//@Autowired//@Qualifier("userDao")@value("#{userDao}") //@Value("#{}")的方式 使用注解注入,要与dao实现类的注解一致(使用注解 不需要setter方法, 如果没有构造方法,使用xml配置的时候需要setter方法)private UserDao userDao;@Overridepublic void getUser() {System.out.println("1 业务层1 获取user对象...");userDao.getUser();} }
测试:
@Testpublic void getUser() throws Exception {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = ac.getBean("userService", UserService.class);userService.getUser();}
运行结果:
其他注解的使用:
生命周期注解:
@PostConstruct 初始化方法
@PreDestroy 销毁方法
//Bean的注解 @Component("springLifeCycle") public class SpringLifeCycle {//构造方法public SpringLifeCycle() {System.out.println("SpringLifeCycle 构造...");}//初始化方法的注解 @PostConstructpublic void init() {System.out.println("SpringLifeCycle 初始化...");}//销毁方法的注解 @PreDestroypublic void destroy() {System.out.println("SpringLifeCycle 销毁...");}public void helloSpring() {System.out.println("hello spring !");} }
测试:
@Testpublic void testLifeCycle() {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");SpringLifeCycle springLifeCycle = (SpringLifeCycle) ac.getBean("springLifeCycle");springLifeCycle.helloSpring();// 调用close(ApplicationContext没有close方法,需要转子类调用close)ClassPathXmlApplicationContext classAc = (ClassPathXmlApplicationContext) ac;classAc.close();}
运行结果:
Bean的作用域注解:
还是上面的JavaBean类:
//Bean的注解 @Component("springLifeCycle") //作用域注解 prototype为多实例,默认为singleton单实例 @Scope("prototype") public class SpringLifeCycle {
测试:
@Testpublic void testScope() throws Exception {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");SpringLifeCycle lifeCycleBean1 = (SpringLifeCycle) applicationContext.getBean("springLifeCycle");SpringLifeCycle lifeCycleBean2 = (SpringLifeCycle) applicationContext.getBean("springLifeCycle");System.out.println(lifeCycleBean1);System.out.println(lifeCycleBean2);// 通过反射 代码调用 close方法Method closeMethod = applicationContext.getClass().getMethod("close");closeMethod.invoke(applicationContext);}
运行结果:
大家会发现销毁方法没有起作用,这里说明一下,Bean必须为singleton单实例的时候,销毁方法才能执行。
将scope设置成singleton:
//Bean的注解 @Component("springLifeCycle") //作用域注解,singleton为默认值,可以不写这个注解 @Scope("singleton") public class SpringLifeCycle {
执行结果:
转载于:https://www.cnblogs.com/blazeZzz/p/9305861.html
Spring总结四:IOC和DI 注解方式相关推荐
- 用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)
用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心. 依赖注入(DI) ...
- 【java学习之路】(java框架)007.IoC和DI注解开发
IoC和DI注解开发 Spring配置数据源 数据源(连接池)的作用 • 数据源(连接池)是提高程序性能如出现的 • 事先实例化数据源,初始化部分连接资源 • 使用连接资源时从数据源中获取 • 使用完 ...
- Spring IoC和DI XML方式 注解方式 依赖注入 AOP面向切面
初识Spring框架 时代变迁 原始时代我们用一个jsp搞定一切,但如此开发大型项目时我们遇到了问题,前端美化的代码和后端的代码交织,代码中又有html.js.css样式,又有业务逻辑和数据库访问代码 ...
- Spring中的Ioc、DI到底是啥
我们都知道,Spring是一款轻量级的IOC框架,Spring的核心就是Ioc和DI,并通过俩者解耦. 那么,Ioc.DI呢? Ioc 控制反转 Ioc(Inversion of control)控制 ...
- Spring框架,IOC,DI,AOP,单例多例,懒加载
文章目录 1.Spring 2.IOC 2.1 什么是IOC 2.2 xml配置文件管理对象 2.3 全注解的方式管理对象 3.Spring创建对象-工厂模式(必会内容) 4.单例与多例 4.1@Sc ...
- 请简述什么是spring的ioc和di_小编Spring是什么、spring容器、IOC和DI
1.Spring (1)Spring是什么? 是一个轻量级的.用来简化企业级应用开发的开发框架. 注: a.简化开发: Spring对常用的api做了简化,比如,使用Spring jdbc来访问数据库 ...
- 请简述什么是spring的ioc和di_理解Spring中的IoC和DI
什么是IoC和DI IoC(Inversion of Control 控制反转):是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度.其基本思想是:借助于"第三方" ...
- Spring详解—— IOC 和 DI 区别
1.本章前言 我们只要提到Spring这个词,有简单了解过Spring的人基本上都会脱口而出IoC.DI和AOP这几个概念.但是对于初学者来说,一下子搞懂IoC和DI的概念还是挺麻烦的.比如之前我自己 ...
- Spring 框架 详解 (四)------IOC装配Bean(注解方式)
Spring的注解装配Bean Spring2.5 引入使用注解去定义Bean @Component 描述Spring框架中Bean Spring的框架中提供了与@Component注解等效的三个注 ...
最新文章
- php中年月日用什么参数,PHP中date()日期函数参数整理
- 轮椅上的博士矣晓沅:9 年求学路,我从清华毕业了
- php 对接中国天气网 城市 id json串
- 虚拟机:Centos 7 安装JDK8(亲测)
- 设置View单个圆角
- mysql varchar(20)_MySQL中采用类型varchar(20)和varchar(255)对性能上的影响
- Windows下搭建elasticsearch集群案例
- 2018年流行的vue前端UI框架
- Bailian4101 晶矿的个数【DFS】
- 关于MDI窗体的那些问题
- equals方法的使用几种情况
- 133 MySQL视图、事务、索引(都很重要)
- 全面讲解在BIOS设置IDE设备的多种组合方式
- 【用Python对全职高手小说分析分词词频词性,小说人物出场次数排序,小说中食物排序,小说人物关系等等】
- 网课查题微信公众号如何搭建步骤
- html文字段落设置,p字间距 html段落内文字设置字间距间隔
- Problem E: 薪酬计算
- Context context = getApplicationContext()
- 项目构建CPU满载问题的根源的查找
- 2021-2025年中国无线鼠标和键盘行业市场供需与战略研究报告
热门文章
- CentOS 7 中firewall-cmd命令
- 很不错的Windows 控件 Developer Express Inc.NET
- [转]numpy中的np.max 与 np.maximum区别
- 浅谈mpvue项目目录和文件结构
- python cookbook 笔记三
- Apache + Tomcat 配置多个应用
- 线程、同步与锁——Mutex想说爱你不容易
- 【注册机】Zillions of Games v2.0.1p 注册机
- [紧急问题和解决方案] 无法打开被权限管理服务(RMS)加密的Office 2003文档
- 实体以及实体型和实体集