zoukankan      html  css  js  c++  java
  • 关于注入

    1.在未使用注解时,我们使用XML文件来注入对象

    //SimpleAction.java
    public class SimpleAction {
        private SimpleService s;
        //注意:xml注入必须配置setter(可写)
       public void setS(SimpleService s){   this.s = s; } public void run(){   s.say(); } } //SimpleService.java public interface SimpleService { public void say(); } //SimpleServiceImpl.java public class SimpleServiceImpl implements SimpleService{ private String name="zhangsan"; @Override public void say() { System.out.println(this.name); } }
    <!-- XML配置 -->
    <bean id="simpleAction" class="com.thunder.action.SimpleAction">
        <property name="s" ref="simpleService"/>
    </bean>
    <bean id="simpleService" class="com.thunder.service.SimpleServiceImpl"/>
    //JUnit测试
    //读取配置文件
    private ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        
    @Test
    public void ITest(){
        SimpleAction a = (SimpleAction)ctx.getBean("simpleAction");
        SimpleService s = (SimpleService)ctx.getBean("simpleService");
        s.say();
        a.run();    
    }

    2.最常用的两种注解:@Resource(推荐、JSR-250提供)、@Autowired(不推荐、Spring提供)

    -->@Resource

    <!-- 开启注解、扫描base-package包及其子包 -->
    <context:component-scan base-package="com.thunder"/>
    //SimpleAction.java
    @Controller
    public class SimpleAction {
       //这里替换成@Autowired也正确,使用注解则无需提供setter
        @Resource
        private SimpleService s;
        public void run(){
            s.say();
        }
    }
    
    //SimpleService.java
    public interface SimpleService {
        public void say();
    }
    
    //SimpleServiceImpl.java
    @Service
    public class SimpleServiceImpl implements SimpleService{
        private String name="zhangsan";
        @Override
        public void say() {
        System.out.println(this.name);
        }
    }
    //JUnit测试
    private ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    
    @Test
    public void ITest(){
        SimpleAction a = (SimpleAction)ctx.getBean("simpleAction");
        SimpleService s = (SimpleService)ctx.getBean("simpleServiceImpl");
        s.say();
        a.run();
    }

    说明:

    --->@Autowired是根据类型进行自动装配的,如果有多个对应类型的bean存在则会报错,此时需要使用@Qualifier来指定使用哪个bean。

      另外如果没匹配到bean则会报错,此时可以将@Autowired的required属性置为false

      ps.@Autowired注解可以写在字段上边,方法上边或者构造函数上边,@Qualifier可以写在方法上边或者形参前边,但必须跟着@Autowired。

    --->@Resource装配规则

      @Resource应用于字段时的规则:
      a.先使用【字段名字】匹配bean,查找到bean则注入,如果此bean类型不匹配则此时有异常,注入失败

      b.如果字段名字没有匹配到Bean,则采用【字段类型】匹配,如果找到bean则注入。如果字段类型是接口,且匹配到多个类型,则会抛出异常.

      @Resource应用于setter方法的规则:

      a.先使用【字段名字】匹配bean,查找到bean则注入,如果此bean类型不匹配则此时有异常,注入失败

      b.如果字段名字没有匹配到Bean,则采用【setter形参类型】匹配,如果找到bean则注入。如果字段类型是接口,且匹配到多个类型,则会抛出异常.

    ----->关于@Resource的属性,较重要的有两个name和type

      如果name和type都没有指定,查找bean的规则如上所述。而如果指定了name则只按规则a查找,如果指定了type则只按规则b查找。

  • 相关阅读:
    Pausing Coyote HTTP/1.1 on http-8080
    网站后台管理中生成首页失败
    Eclipse快捷键集结
    电子商务网站推广10大方法
    Eclipse使用
    注册表中更换桌面背景
    网站卡死,照惯例运行.bat批量处理文件进行重启不起作用
    同时处理html+js+jquery+css的插件安装(Spket&Aptana插件安装)
    JQuery的插件
    Eclipse插件
  • 原文地址:https://www.cnblogs.com/zaixiuxing/p/5101921.html
Copyright © 2011-2022 走看看