转载

spring 装配bean的三种方式

spring 装配bean的三种方式

什么是依赖注入呢?也可以称为控制反转,简单的来说,一般完成稍微复杂的业务逻辑,可能需要多个类,会出现有些类要引用其他类的实例,也可以称为依赖其他类。传统的方法就是直接引用那个类对象作为自己的一个属性,但如果我们每次创建这个类的对象时,都会创建依赖的类的对象,还有如果那个类将来可能不用了,还需要到这个类去删除这个对象,那破坏了代码的复用性和导致高度耦合!

依赖注入的出现可以很好地解决这个问题,依赖注入就是由系统负责协调类的依赖对象的创建,我们无需自己去显示的创建依赖对象,而是由系统给我们注入这个对象,系统控制了这个对象的创建,也称为控制反转。

Spring给我们注入对象有三种方式:

隐式的bean扫描发现机制和自动装配

在java中进行显示配置

在XML中进行显示配置

第一种:

spring从两个角度实现自动化装配:组件扫描和自动装配。

当对一个类标注@Component注解时,表明该类会作为组件类,spring将为这个类创建bean。当在应用文中引用这个bean,spring会自动扫描事先指定的包查找这个 bean。但spring默认是不启用组件扫描的,可以在XML中配置加上。还有一种方法:在新建一个配置类,类中可以什么不用写,在配置类上加上@ComponentScan注解,spring会自动扫描改配置类所在的包,一般应该倾向xml配置。下面是一个bbs论坛系统用户发帖的功能小例子:

[Java] 纯文本查看 复制代码

?

<font style="color:rgb(74, 74, 74)"><font face="Avenir, -apple-system-font, 微软雅黑, sans-serif"><font style="font-size:16px"> @Component

public interface Postdao {

/*
 *用户发帖 ,post表添加帖子信息
  */
 public int addpost(@Param("title") String title,@Param("content") String content,@Param("userid") int userid);

}

package bbs.dao;

@Component

public interface Userdao {

/*
 * 用户发帖后,user表将用户发帖数加一
  */
public int addpost(int userid);

}

</font></font></font>

[Java] 纯文本查看 复制代码

?

<font style="color:rgb(74, 74, 74)"><font face="Avenir, -apple-system-font, 微软雅黑, sans-serif"><font style="font-size:16px">public interface PostService {

/*
用户发帖后,先添加帖子信息再更新用户发帖数量
*/
public void addpost(String title,String content,int userid);

}

package bbs.service;

@Component

public class PostserviceImpl implements PostService {

private Postdao postdao;
 private Userdao userdao;

@Autowired

public void setPostdao(Postdao postdao)
{
   this.postdao=postdao;
}

@Autowired

public void setUserdao(Userdao userdao)
{
    this.userdao=userdao;
}

@Autowired
 public PostserviceImpl(Postdao postdao,Userdao userdao)
 {
     this.userdao=userdao;
    this.postdao=postdao;
}

 public void addpost(String title, String content, int userid) {
     int i=postdao.addpost(title, content, userid);
    int j=userdao.addpost(userid);
    if(i==1&j==1)
         System.out.println("发帖成功");
     else
         System.out.println("发帖失败");
}

}

</font></font></font>

@Component在接口实现上注解就可以,但发现在userdao、postdao接口也加上了,其实可以去掉,因为我采用mybatis在xml中配置数据库的操作,动态实现dao接口。等下会提到。上面代码出现的@Autowired注解实现bean自动装配,会在spring应用上下文中的组件类寻找需求的bean。一般有两种装配方式:构造器和Setter方法(其他方法名也行,只要能够使注入的bean成为这个类的属性就行)

也可能出现spring没有查找到匹配的bean会抛出异常,在@Autowired加上required=false,如果没有匹配的bean时,spring会使这个bean处于未装配的状态,没有装配成功。还有可能会出现相同名字的bean有很多个,会产生歧义,一般在组件类上添加注解@Qualifier()括号写这个bean的id,在注入时也加上@Qualifier(),写上bean的id。

原文  https://segmentfault.com/a/1190000020868245
正文到此结束
Loading...