系统学习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.

转载于:https://www.cnblogs.com/yjhk/archive/2013/03/26/2983696.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring是掠过Java大地的一阵清风。Spring是以反向控制设计原理为基础,无需EJB而功能依然强大的轻量级J2EE开发框架。Spring大大简化了使用接口开发的复杂性,并且加快和简化了应用系统的开发。使用简单JavaBean就可以得到EJB的强大功能。<br>本书介绍了Spring背后的原理,引领你迅速进入对框架的体验之中。结合简短代码片断和贯穿全书的持续示例,本书向你展示了如何创建简单有效的J2EE应用系统。你将看到如何使用先进的开源工具解决持久层问题,以及如何将你的应用系统与其他流行Web框架集成。你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。<br>本书内容:<br>·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层;<br>·声明式事务与事务管理;<br>·与其他Web框架集成:Struts、WebWork、Tapestry、Velocity;<br>·访问J2EE服务,如JMS和EJB;<br>·使用AOP解决交叉问题;<br>·企业组应用系统最佳实践。<br>“……一种解释Spring中各个主题的很好途径……我喜欢这本书”<br>——Christian Parker,Adigio公司总裁<br>“……没有其他书籍可以与这本书的实用性相提并论。”<br>——Olivier Jolly,J2EE构架师,Interface SI<br>“我很喜欢这种展示Spring的方式。”<br>——Norman Richards,XDoclet in Action的作者之一<br>“我极力推荐这本书。”<br>——Jack Herrington,Code Generation in Action的作者 <br>----总共8部分rar下载完后解压 -----<br>Spring in Action. 中文版.part1.rar<br>Spring in Action. 中文版.part2.rar<br>Spring in Action. 中文版.part3.rar<br>Spring in Action. 中文版.part4.rar<br>Spring in Action. 中文版.part5.rar<br>Spring in Action. 中文版.part6.rar<br>Spring in Action. 中文版.part7.rar<br>Spring in Action. 中文版.part8.rar<br>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值