Spring中的@Autowired依赖注入

来源:互联网 发布:成都犀牛软件培训 编辑:程序博客网 时间:2024/04/30 09:49

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

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

@Autowired 是ByType的

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

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

核心xml:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:context="http://www.springframework.org/schema/context"    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context.xsd" >        <context:component-scan base-package="com.imooc.beanannotation"></context:component-scan>     </beans>

我们让Spring扫描 com.imooc.beanannotation

DAO类

package com.imooc.beanannotation;import org.springframework.stereotype.Repository;@Repositorypublic 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;@Servicepublic 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;@Servicepublic 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;@Servicepublic 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





 

0 0
原创粉丝点击