首先我们要了解注解和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 注解方式相关推荐

  1. 用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)

    用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心. 依赖注入(DI) ...

  2. 【java学习之路】(java框架)007.IoC和DI注解开发

    IoC和DI注解开发 Spring配置数据源 数据源(连接池)的作用 • 数据源(连接池)是提高程序性能如出现的 • 事先实例化数据源,初始化部分连接资源 • 使用连接资源时从数据源中获取 • 使用完 ...

  3. Spring IoC和DI XML方式 注解方式 依赖注入 AOP面向切面

    初识Spring框架 时代变迁 原始时代我们用一个jsp搞定一切,但如此开发大型项目时我们遇到了问题,前端美化的代码和后端的代码交织,代码中又有html.js.css样式,又有业务逻辑和数据库访问代码 ...

  4. Spring中的Ioc、DI到底是啥

    我们都知道,Spring是一款轻量级的IOC框架,Spring的核心就是Ioc和DI,并通过俩者解耦. 那么,Ioc.DI呢? Ioc 控制反转 Ioc(Inversion of control)控制 ...

  5. Spring框架,IOC,DI,AOP,单例多例,懒加载

    文章目录 1.Spring 2.IOC 2.1 什么是IOC 2.2 xml配置文件管理对象 2.3 全注解的方式管理对象 3.Spring创建对象-工厂模式(必会内容) 4.单例与多例 4.1@Sc ...

  6. 请简述什么是spring的ioc和di_小编Spring是什么、spring容器、IOC和DI

    1.Spring (1)Spring是什么? 是一个轻量级的.用来简化企业级应用开发的开发框架. 注: a.简化开发: Spring对常用的api做了简化,比如,使用Spring jdbc来访问数据库 ...

  7. 请简述什么是spring的ioc和di_理解Spring中的IoC和DI

    什么是IoC和DI IoC(Inversion of Control 控制反转):是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度.其基本思想是:借助于"第三方" ...

  8. Spring详解—— IOC 和 DI 区别

    1.本章前言 我们只要提到Spring这个词,有简单了解过Spring的人基本上都会脱口而出IoC.DI和AOP这几个概念.但是对于初学者来说,一下子搞懂IoC和DI的概念还是挺麻烦的.比如之前我自己 ...

  9. Spring 框架 详解 (四)------IOC装配Bean(注解方式)

    Spring的注解装配Bean Spring2.5 引入使用注解去定义Bean @Component  描述Spring框架中Bean Spring的框架中提供了与@Component注解等效的三个注 ...

最新文章

  1. php中年月日用什么参数,PHP中date()日期函数参数整理
  2. 轮椅上的博士矣晓沅:9 年求学路,我从清华毕业了
  3. php 对接中国天气网 城市 id json串
  4. 虚拟机:Centos 7 安装JDK8(亲测)
  5. 设置View单个圆角
  6. mysql varchar(20)_MySQL中采用类型varchar(20)和varchar(255)对性能上的影响
  7. Windows下搭建elasticsearch集群案例
  8. 2018年流行的vue前端UI框架
  9. Bailian4101 晶矿的个数【DFS】
  10. 关于MDI窗体的那些问题
  11. equals方法的使用几种情况
  12. 133 MySQL视图、事务、索引(都很重要)
  13. 全面讲解在BIOS设置IDE设备的多种组合方式
  14. 【用Python对全职高手小说分析分词词频词性,小说人物出场次数排序,小说中食物排序,小说人物关系等等】
  15. 网课查题微信公众号如何搭建步骤
  16. html文字段落设置,p字间距 html段落内文字设置字间距间隔
  17. Problem E: 薪酬计算
  18. Context context = getApplicationContext()
  19. 项目构建CPU满载问题的根源的查找
  20. 2021-2025年中国无线鼠标和键盘行业市场供需与战略研究报告

热门文章

  1. CentOS 7 中firewall-cmd命令
  2. 很不错的Windows 控件 Developer Express Inc.NET
  3. [转]numpy中的np.max 与 np.maximum区别
  4. 浅谈mpvue项目目录和文件结构
  5. python cookbook 笔记三
  6. Apache + Tomcat 配置多个应用
  7. 线程、同步与锁——Mutex想说爱你不容易
  8. 【注册机】Zillions of Games v2.0.1p 注册机
  9. [紧急问题和解决方案] 无法打开被权限管理服务(RMS)加密的Office 2003文档
  10. 实体以及实体型和实体集