Spring中的@Autowired依赖注入

@Autowired注解 注解能够作用于构建器、属性、方法。这里的方法不局限于设值方法,即setter方法,常见的各种方法都可以应用这一注解

@Autowired(required=false) 可以避免找不到bean时的抛出异常,每一个类只能有一个构造器被声明为required=false

@Autowired 是ByType的

下面举一个用于属性的实例:

第一步:完成xml与DAO类和其接口、Servicer类及其接口

核心xml:



            
 

我们让Spring扫描 com.imooc.beanannotation

DAO类

package com.imooc.beanannotation;
import org.springframework.stereotype.Repository;
@Repository
public class InjectionDAOimpl implements InjectionDAO {
 public void save(String arg) {
  // TODO Auto-generated method stub
  System.out.println("保存数据:"+arg);
 }
}

这里@Repository是关键,因为spring是通过这个注解认为这个类是DAO类的,@Repository 将 DAO 类声明为 Bean

如果没有这个注解@Repository,那么我们需要自己在Spring的配置文件中配置这个bean

DAO接口

package com.imooc.beanannotation;
import org.springframework.stereotype.Repository;
public interface InjectionDAO {
 public void save(String arg);
}

Service类

package com.imooc.beanannotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class InjectionServiceimpl implements InjectionService {
     @Autowired
 private InjectionDAO injectionDAO;
 public void save(String arg) {
  // TODO Auto-generated method stub
  System.out.println("接受数据"+arg);
  arg=arg+":"+this.hashCode();
  injectionDAO.save(arg);
 }
}

这里@Service注解 和@Autowired 值得注意,@Service将该类标记为服务层,并加入bean,@Autowired为我们注入InjectionDAO接口

Service类接口

package com.imooc.beanannotation;
public interface InjectionService {   
 public void save(String arg);
}

测试类:

package com.imooc.beanannotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestInjection {
    public static void main(String[] args) {
  ApplicationContext ctx=new ClassPathXmlApplicationContext("spring-beanannotation.xml");
  InjectionService service=(InjectionService) ctx.getBean("injectionServiceimpl");
  service.save("this is a autowired");
 }
}

可以看见   其实我们只需要getbean(接口(小写即默认名字))就可获得实现类的实例,这个例子证明我们可以用

@Autowired装配类以获取实例

这是@AutoWired用于构造器的例子

只需要修改Service类

package com.imooc.beanannotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class InjectionServiceimpl implements InjectionService {
    // @Autowired
 private InjectionDAO injectionDAO;
 @Autowired
    public InjectionServiceimpl(InjectionDAO injectionDAO)
     {
      this.injectionDAO=injectionDAO;
     }
 public void save(String arg) {
  // TODO Auto-generated method stub
  System.out.println("接受数据"+arg);
  arg=arg+":"+this.hashCode();
  injectionDAO.save(arg);
 }
}

请注意,原来我们在是在属性上用的@Autowired,现在用在构造器上。其实就相当于在构造方法中将InjectionDAO实例化了

注意下面的例子,这是一个很容易犯的错误

package com.imooc.beanannotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class InjectionServiceimpl implements InjectionService {
     @Autowired
 private InjectionDAO injectionDAO;
    public InjectionServiceimpl()
     {
      this.injectionDAO=injectionDAO;
     }
 public void save(String arg) {
  // TODO Auto-generated method stub
  System.out.println("接受数据"+arg);
  arg=arg+":"+this.hashCode();
  injectionDAO.save(arg);
 }
}
这个时候运行是会出错的,这是因为程序会先运行构造方法,再装载InjectionDAO




 

你可能感兴趣的:(Spring)