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

posted @ 2013-03-26 23:21  养家糊口  阅读(1923)  评论(0编辑  收藏  举报