系统学习Spring之Spring in action(六)
每日一叨:
老婆回家准备些结婚用的东西去咯~~一个人可以有更多的时间来写博客了,最大的问题是星期六,星期天的饭该怎么吃呀....难道要吃蛋炒饭?泡面?
算了,不想了,双休自己去买点菜看着菜谱烧,,只要熟了,不要太咸应该没有什么大问题,我要求不高..
文章导读:
1.Spring注解@Inject、@Named与@Value
2.Spring支持自动发现bean功能
知识点:
在Java社区的不断努力下,把多种多样的依赖注入框架统一成了一个程序设计模型规范JSR-330.Spring3现在已经支持这个模型了.
JSR-330核心的装饰品是@Inject注解.@Inject几乎可以完全代替@Autowired 注解.先上事例吧
1.Spring注解@Inject、@Named与@Value
首先来对比下@Autowired和@Inject是如何使用的.
public interface Game { //获取游戏名称 public void getGameName(); }
这是@Inject的用法
public class Dota implements Game { //游戏作者 private String author; @Inject private War3 war; @Override public void getGameName() { // TODO Auto-generated method stub System.out.println("大家好,我们名字叫Dota,来自"+ this.author + "之手"); this.war.getGameName(); } //省略geter和setter方法 }
这是@Autowired用法
public class Dota implements Game { //游戏作者 private String author; @Autowired private War3 war; @Override public void getGameName() { // TODO Auto-generated method stub System.out.println("大家好,我们名字叫Dota,来自"+ this.author + "之手"); this.war.getGameName(); } //省略getter和setter方法 }
Spring配置文件:
<bean id="war3" class="com.ricky.zero.pojo.War3"></bean> <bean id="dota" class="com.ricky.zero.pojo.Dota"> <property name="author" value="冰蛙"></property> </bean>
运行测试:
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml"); Dota dota = (Dota)ctx.getBean("dota"); dota.getGameName();
测试结果:
大家好,我们名字叫Dota,来自冰蛙之手
大家好,我的名字叫魔兽争霸,相信你们很多人都已经认识我了.
@Inject和@Autowired一样,都是默认byType搜索策略.
当多个bean同时成为候选着,两者都会抛异常,@Autowired的解决方法是@Qualifier注解在候选者只选择beanId与value相同的bean.
而@Inject将会使用另一个注解@Named来解决这个问题,看事例:
修改配置文件:
<bean id="war3" class="com.ricky.zero.pojo.War3"></bean> <bean id="war4" class="com.ricky.zero.pojo.War3"></bean> <bean id="dota" class="com.ricky.zero.pojo.Dota"> <property name="author" value="冰蛙"></property> </bean>
修改Dota类:
public class Dota implements Game { //游戏作者 private String author; @Inject @Named("war3") private War3 war; @Override public void getGameName() { // TODO Auto-generated method stub System.out.println("大家好,我们名字叫Dota,来自"+ this.author + "之手"); this.war.getGameName(); } //省略getter和setter方法 }
运行测试,并得到测试结果如下:
大家好,我们名字叫Dota,来自冰蛙之手
大家好,我的名字叫魔兽争霸,相信你们很多人都已经认识我了.
@Named的作用有点类似于@Qualifier注解,从候选bean中直接选择匹配的bean.
如何在Spring中装配基本类型(int ,boolean,string),Spring提供一种可以装配基本类型的注解@Value.
@Value可以直接把基本类型的值注入到属性上,以后可以不用在写getter和setter方法了.事例如下:
修改配置文件:
<bean id="war3" class="com.ricky.zero.pojo.War3"></bean> <bean id="war4" class="com.ricky.zero.pojo.War3"></bean> <bean id="dota" class="com.ricky.zero.pojo.Dota"></bean>
修改Dota类:
public class Dota implements Game { //游戏作者 @Value("冰蛙") private String author; @Inject @Named("war3") private War3 war; @Override public void getGameName() { // TODO Auto-generated method stub System.out.println("大家好,我们名字叫Dota,来自"+ this.author + "之手"); this.war.getGameName(); } }
运行测试后得到结果如下:
大家好,我们名字叫Dota,来自冰蛙之手
大家好,我的名字叫魔兽争霸,相信你们很多人都已经认识我了.
与之前相比,代码精简了很多,省去了xml中的配置和类中的属性的getter方法 和setter方法.
@Value除了可以注入基本属性的值,还可以通过SpEL返回值来注入,事例如下:
修改Dota类:
public class Dota implements Game { //游戏作者 @Value("冰蛙#{T(java.lang.Math).PI}") private String author; @Inject @Named("war3") private War3 war; @Override public void getGameName() { // TODO Auto-generated method stub System.out.println("大家好,我们名字叫Dota,来自"+ this.author + "之手"); this.war.getGameName(); } }
可以在@Value注解中直接注入SpEL的返回值,如上,直接在author中注入了PI的值
运行测试结果为:
大家好,我们名字叫Dota,来自冰蛙3.141592653589793之手
大家好,我的名字叫魔兽争霸,相信你们很多人都已经认识我了.
成功通过@Value注入SpEL返回值成功.
2.Spring支持自动发现bean功能
在Spring Configuration中<context:annotation-config>配置致力于消除大量的<properteis>和<constructor-arg>标签,但是仍然要在
配置文件中配置<bean>标签.Spring提供自动发现bean的功能,以后可以不用写bean也能完成定义和装配.只需要在配置文件中用
<context:component-scan>代替<context:annotation-config>,因为后者能完成的任务,前者都能完成.
<context:component-scan base-package="com.ricky.zero"> </context:component-scan>
自动发现bean功能会搜索com.ricky.zero包和它的子包.
可以被自动发现的注解bean有4种:@Component,@Controller,@Service,@Repository.
@Component:一个通用的注解,它告诉类它是一个Spring组件.
@Controller:告诉类,它是一个SpringMVC的控制器
@Service:告诉类,它是一个Service.
@Repository:告诉类,它是一个数据存储库.
下面来看事例:
@Component("war3") public class War3 implements Game { @Override public void getGameName() { // TODO Auto-generated method stub System.out.println("大家好,我的名字叫魔兽争霸,相信你们很多人都已经认识我了."); } }
@Component("dota") public class Dota implements Game { //游戏作者 @Value("冰蛙") private String author; @Inject @Named("war3") private War3 war; @Override public void getGameName() { // TODO Auto-generated method stub System.out.println("大家好,我们名字叫Dota,来自"+ this.author + "之手"); this.war.getGameName(); } }
Spring配置文件:
<context:component-scan base-package="com.ricky.zero"> </context:component-scan>
现在不需要在手动配置bean了.
运行测试并得到结果:
大家好,我们名字叫Dota,来自冰蛙之手
大家好,我的名字叫魔兽争霸,相信你们很多人都已经认识我了.
Spring提供这个技术后,以后不用手动再去XML中配置bean了,至于bean中的属性直接在类中通过注解注入.
依赖注入到这里就要结束了,基于Java-base配置的没有讲,还是喜欢常规的XML配置,直接在普通的Java类中配置还是很不习惯,想要了解下
如何用Java普通类配置Spring,可以去Spring官网继续了解.
下面我将会继续分享Spring的面向切面编程(AOP,Aspect-oriented Programming)
--------------------------------申明----------------------------
本文可以免费阅读以及转载,转载时请注明出处.
本人邮箱:Ricky_LS@163.com
Thank you for your corporation.