Spring依赖注入(注解方式)

在Spring中,尽管使用XML配置文件就可以实现Bean的装配工作,但如果应用中Bean的数量较多,会导致XML配置文件过于臃肿,从而给程序的维护与升级带来一定的困难。

Java从JDK5.0以后,提供了Annotation(注解)功能,Spring也提供了对注解技术的全面支持。

一,Spring中注入常用的注解如下:

1,@Component

可以使用此注解描述Spring中的Bean,它是一个泛化的概念,表示一个组件(Bean),可以作用在任何层次。使用时只需要将该注解标注在相应的类上即可。

2,@Repository

用于将数据访问层(DAO层)的类标识为Spring中的Bean,其功能与@Component相同。

3,@Service

用于将业务层(Service层)的类标识为Spring中的Bean,其功能与@Component相同。

4,@Controller

用于将控制层的类标识为Spring中的Bean,其功能与@Component相同。

5,@Autowired

用于对Bean的属性变量,属性的Set方法以及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作。默认按照Bean的类型(type)进行装配。

6,@Resource

作用与@Autowired一样。区别在于@Autowired默认按照Bean类型(type)注入,而@Resource默认按照Bean实例名称进行装配

@Resource 中有两个重要属性:name 和 type。

Spring 将 name 属性解析为 Bean 实例名称,type 属性解析为 Bean 实例类型。如果指定 name 属性,则按实例名称进行装配;如果指定 type 属性,则按 Bean 类型进行装配。

如果都不指定,则先按 Bean 实例名称装配,如果不能匹配,则再按照 Bean 类型进行装配;如果都无法匹配,则抛出 NoSuchBeanDefinitionException 异常。

7,@Qualifier

与@Autowired注解配合使用,会将默认的按照Bean类型注入改为按照Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。

二,应用实例

1.创建DAO层接口

在 src 目录下创建一个名为 com.ljt.spring的包,在该包下创建一个名为 PersonDao 的接口,并添加一个 add() 方法。

package com.ljt.spring;public interface PersonDao {public void add();
}
2.创建DAO层接口实现类

在 com.ljt.spring 包下创建 PersonDao 接口的实现类 PersonDaoImpl

package com.ljt.spring;import org.springframework.stereotype.Repository;@Repository("personDao")
public class PersonDaoImpl implements PersonDao {@Overridepublic void add() {System.out.println("Dao层的add()方法执行了");}
}

上述代码中,使用 @Repository 注解将 PersonDaoImpl 类标识为 Spring 中的 Bean,其写法相当于xml配置文件中 <bean id="personDao"class=“com.ljt.spring.PersonDaoImpl”/> 的书写。然后在 add() 方法中输出一句话,用于验证是否成功调用了该方法。

3.创建Service层接口

在 com.ljt.spring包下创建一个名为 PersonService 的接口,并添加一个 add() 方法。

package com.ljt.spring;public interface PersonService {public void add();
}
4.创建Service层的实现类

在 com.mengma.annotation 包下创建 PersonService 接口的实现类 PersonServiceImpl。

package com.ljt.spring;import org.springframework.stereotype.Service;
import javax.annotation.Resource;@Service("personService")
public class PersonServiceImpl implements PersonService {@Resource(name = "personDao")private PersonDao personDao;public PersonDao getPersonDao() {return personDao;}@Overridepublic void add() {personDao.add();    //调用personDao中的add()方法System.out.println("Service层的add()方法执行了");}
}

使用 @Service 注解将 PersonServiceImpl 类标识为 Spring 中的 Bean,其写法相当于xml配置文件中 <bean id="personService"class=“com.ljt.spring.PersonServiceImpl”/>

然后使用 @Resource 注解标注在属性 personDao 上(也可标注在 personDao 的 setPersonDao() 方法上),这相当于配置文件中 <property name="personDao"ref=“personDao”/> 的写法。最后在该类的 add() 方法中调用 personDao 中的 add() 方法。

5.创建Controller层

在 com.ljt.spring 包下创建一个名为 PersonController 的类

package com.ljt.spring;import org.springframework.stereotype.Controller;
import javax.annotation.Resource;@Controller("personController")
public class PersonController {@Resource(name = "personService")private PersonService personService;public PersonService getPersonService() {return personService;}public void add(){personService.add();    //调用personService中的add()方法System.out.println("Controller层的add()方法执行了");}
}

使用 @Controller 注解标注 PersonController 类,其写法相当于在配置文件中编写 <bean id="personController"class=“com.ljt.spring.PersonController”/>。

然后使用了 @Resource 注解标注在 personService 上,这相当于在配置文件内编写 <property name="personService"ref=“personService”/>。

最后在其 add() 方法中调用了 personService 中的 add() 方法。

6.编写xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--使用context,通知spring扫描指定目录,进行注解解析--><context:component-scan base-package="com.ljt.spring"/>
</beans>

使用 context :component-scan 元素进行注解的扫描,其 base-package 属性用于告诉 spring 所需要注解扫描的目录。

7.创建测试类查看测试结果

创建测试类AnnotationTest

package com.ljt.spring;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class AnnotationTest {@Testpublic void test(){//初始化spring容器,加载xml配置文件,实例化beanApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");//获取PersonController实例PersonController personController = (PersonController) applicationContext.getBean("personController");//调用PersonController中的add()方法personController.add();}
}

通过加载配置文件spring.xml并获取 personController 的实例,然后调用该实例的 add() 方法。

使用 JUnit 测试运行 test() 方法,测试结果如下所示

Dao层的add()方法执行了
Service层的add()方法执行了
Controller层的add()方法执行了

Spring依赖注入(注解方式)相关推荐

  1. Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件...

    1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...

  2. 【spring系列】spring依赖注入实现方式(含案例)

    依赖注入是时下最流行的IoC实现方式, 依赖注入分为 接口注入(Interface Injection), Setter方法注入(Setter Injection) 构造器注入(Constructor ...

  3. Spring依赖注入:注解注入总结

    更多11 spring 依赖注入 注解 java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.C ...

  4. Spring 依赖注入的理解及三种注入方式

    Spring 依赖注入概念和三种注入方式(理解及应用) 什么是注入 要了解Spring的三种注入方式首先前提是得先了解一下什么是注入,相信很多人对这个概念都是模糊不清的,网上的解释是这样的: 依赖注入 ...

  5. spring依赖注入的三种方式以及优缺点

    spring依赖注入的三种方式以及优缺点 一.依赖注入的三种方式 1.通过构造器注入.(spring4.3之后,推荐使用) 2.通过setter注入.(spring4.3之前,推荐使用) 3通过fil ...

  6. Spring依赖注入的两种方式(根据实例详解)

    1,Set注入    2,构造注入 Set方法注入: 原理:通过类的setter方法完成依赖关系的设置 name属性的取值依setter方法名而定,要求这个类里面这个对应的属性必须有setter方法. ...

  7. spring依赖注入的4种方式

    Spring 依赖注入的4种方式 一.Set注入 必须要有setter方法 public class UserDao {public void test(){System.out.println(&q ...

  8. spring依赖注入简介以及依赖注入的两种方式

    1.spring依赖注入简介 依赖注入:Set注入1.依赖:bean对象创建依赖于容器!2.注入:bean对象中的所有属性,由容器来注入! 2.依赖注入的两种方式   实体类: package com ...

  9. spring依赖注入三种方式

    首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入. 依赖注入是指:让调用类对某一接口的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Spring容器中 ...

最新文章

  1. android:layout_gravity和android:gravity属性的区别
  2. tnsping通oracle连不上,写正确了tnsnames文件却tnsping无法ping通
  3. 问题 | UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 29解决办法
  4. 如何安装mysql5.6.16_centos安装mysql5.6.16
  5. 台式电源GX450的开关O和-到底什么意思
  6. 第八课-第二讲 08_02_bash脚本编程之七 case语句及脚本选项进阶
  7. pycharm 离线安装插件
  8. java 动手动脑
  9. linux 删除进程的多种方法
  10. teechart的addarray_TeeChart经验总结 6.Series之1:Line
  11. (转)宅男程序员福利:来自纽约的28位智慧与美貌并存的IT女神
  12. 电脑使用技巧提升篇10:电脑文件夹加密
  13. 视频倍速调整(ffmpeg)
  14. hexo+github打造个人博客系列之Coding Pages去广告
  15. 60mph和kmh换算_mph和kmh换算(mph换算器)
  16. 小学计算机打字比赛教案,打字比赛活动方案
  17. SQL+Tableau化妆品数据分析
  18. 工作经验和工作经历区别很大
  19. Allegro PCB 软件自动检查走线是否跨分割
  20. 用python画地球_如何用PYTHON程序模拟一个太阳系?

热门文章

  1. CCNA的笔记转载的
  2. Java8 并行流(parallelStream)原理分析及注意事项
  3. 【web前端性能优化】13.城市三级联动
  4. 标准型计算机窗口截图快捷键,如何快速打开电脑上的计算器
  5. 7-4 厘米换算英尺英寸 (15分)
  6. 注册谷歌地图 API 密钥和显示谷歌地图
  7. 有限扩散集团凝聚模型(DLCA)第三讲:流动水流中的凝聚模拟(1)
  8. 使用需求管理工具来提升需求管理和追溯的效率
  9. 专访《硅谷百年史》作者:AI、基因编辑如何在未来10年重塑人类生命形态?
  10. 知乎热议程序员「35岁定律」,30岁转行学Python是否可行?