首先我们要了解注解和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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://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 构造方法");
} @Override
public void getUser() {
System.out.println("UserDao实现类1 获取用户信息...");
}
}

测试:

    @Test
public 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 {
@Override
public 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; @Override
public void getUser() {
System.out.println("1 业务层1 获取user对象...");
userDao.getUser();
}
}

测试:

    @Test
public 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 构造...");
} //初始化方法的注解
@PostConstruct
public void init() {
System.out.println("SpringLifeCycle 初始化...");
} //销毁方法的注解
@PreDestroy
public void destroy() {
System.out.println("SpringLifeCycle 销毁...");
} public void helloSpring() {
System.out.println("hello spring !");
}
}

测试:

    @Test
public 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 {

测试:

    @Test
public 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 {

执行结果:

Spring总结四:IOC和DI 注解方式的更多相关文章

  1. Spring框架(3)---IOC装配Bean(注解方式)

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...

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

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

  3. Spring核心思想——IOC和DI

    基本概念 IOC是什么?     IOC(Inversion of Control)控制反转,IOC是一种新的Java编程模式,目前很多轻量级容器都在广泛使用的模式. IOC解决了什么问题?      ...

  4. IOC——Spring的bean的管理(注解方式)

    注解(简单解释) 1.代码里面特殊标记,使用注解可以完成一定的功能 2.注解写法 @注解名称(属性名称=属性值) 3.注解使用在类上面,方法上面和属性上面 注意:注解方式不能完全替代配置文件方式 Sp ...

  5. spring IOC装配Bean(注解方式)

    1 Spring的注解装配Bean (1) Spring2.5 引入使用注解去定义Bean @Component 描述Spring框架中Bean (2) Spring的框架中提供了与@Componen ...

  6. 理解Spring中的IoC和DI

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

  7. 初识Spring框架实现IOC和DI(依赖注入)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...

  8. spring.net中间IoC、DI和MVC

    轮廓 spring.net它是开源的业务层框架,功能很强大,它归结到什么都有3能:面向切面编程:IoC和DI:提供综合型的框架支持,本片博客主要说一下IoC和DI.和其提供的对MVC框架的支持. Io ...

  9. Spring自学教程-IOC、DI、AOP(二)

    一.spring的IOC-就是怎样使用spring来创建对象 二.springDI(依赖注入)-就是怎样给属性赋值 通过set方式赋值 以下我们只需要记住两点的赋值,基本类型和引用类型的赋值 基本类型 ...

随机推荐

  1. CUDA Samples:Vector Add

    以下CUDA sample是分别用C++和CUDA实现的两向量相加操作,参考CUDA 8.0中的sample:C:\ProgramData\NVIDIA Corporation\CUDA Sample ...

  2. 机器学习算法实现解析——libFM之libFM的训练过程概述

    本节主要介绍的是libFM源码分析的第四部分--libFM的训练. FM模型的训练是FM模型的核心的部分. 4.1.libFM中训练过程的实现 在FM模型的训练过程中,libFM源码中共提供了四种训练 ...

  3. 哈工大同义词词林 python 使用范例

    哈工大的同义词词林,应该是上个世纪的产物,里面的词比较老旧,但好歹也能用 同义词词林的作用,跟word2vec的获取相近词函数比较类似,这两者发挥的功效比较,看具体的应用吧 1. 首先下载包含同义词的 ...

  4. POJ1160 Post Office (四边形不等式优化DP)

    There is a straight highway with villages alongside the highway. The highway is represented as an in ...

  5. LOJ10034 图书管理

    题意 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. 该系统需要支 ...

  6. PADS Router 虚焊盘显示怎么办?

    PADS Router 虚焊盘显示怎么办? 群里朋友有问不知道按了什么键,焊盘显示成以下这种,怎么还原? 解答比较简单,按个 T 就可以. 这个显示是有好处的,特别是焊盘有过孔时一眼就看到.

  7. 使用Inno SetUp脚本打包Winform程序

    在开发桌面程序时,往往需要用到打包工具将程序打包为exe可执行文件. 之前在项目中用了下 InstallShield Limited Edition for Visual Studio  2015,它 ...

  8. Ubuntu14.04安装搜狗输入法的一点小问题

    难得搜狗输入法支持ubuntu,果断下载尝试一把. 官网:http://pinyin.sogou.com/linux/ 官网教程:http://pinyin.sogou.com/linux/help. ...

  9. (转)winform下UPD通信的简单应用

    本文转载自:http://blog.csdn.net/wanlong360599336/article/details/7557046 先看效果图: 使用UDP的好处就是不需要三次握手,但是缺点就是存 ...

  10. 【转】Jmeter参数化

    参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进 ...