Bean的装配方式


    bean的装配方式可以理解为将bean依赖注入到Spring容器中。Spring容器支持基于XML配置的装配、基于注解的装配和自动装配等。最常用的是基于注解的装配。

1. 基于XML配置的装配

    Spring提供了两种基于XML配置的装配方式,即使用构造方法注入和属性的setter方法注入。在使用构造方法注入方式装配bean时,bean的实现类需要提供有参构造函数,并在配置文件中使用元素来定义构造方法的参数;在使用setter方法注入方式装配bean时,bean的实现类需要提供无参构造函数,并为需要注入的属性提供对应的setter方法,在配置文件中用元素为每个属性注入值。    bean的实现类:

package assemble;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ComplexUser {
	private String uname;
	private List<String> hobbyList;
	private Map<String,String> residenceMap;
	private Set<String> aliasSet;
	private String[] array;
	public ComplexUser(String uname, List<String> hobbyList, Map<String, String> residenceMap, Set<String> aliasSet,
			String[] array) {
		super();
		this.uname = uname;
		this.hobbyList = hobbyList;
		this.residenceMap = residenceMap;
		this.aliasSet = aliasSet;
		this.array = array;
	}
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public List<String> getHobbyList() {
		return hobbyList;
	}
	public void setHobbyList(List<String> hobbyList) {
		this.hobbyList = hobbyList;
	}
	public Map<String, String> getResidenceMap() {
		return residenceMap;
	}
	public void setResidenceMap(Map<String, String> residenceMap) {
		this.residenceMap = residenceMap;
	}
	public Set<String> getAliasSet() {
		return aliasSet;
	}
	public void setAliasSet(Set<String> aliasSet) {
		this.aliasSet = aliasSet;
	}
	public String[] getArray() {
		return array;
	}
	public void setArray(String[] array) {
		this.array = array;
	}
	public ComplexUser() {
		super();
	}
	@Override
	public String toString() {
		return "uname=" + uname + ";hobbyList=" + hobbyList + ";residenceMap=" + residenceMap
				+ ";aliasSet=" + aliasSet + ";array=" +array ;
	}
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <!-- 使用构造方法注入方式装配ComplexUser实例user1 -->
    <bean id="user1" class="assemble.ComplexUser">
    <constructor-arg index="0" value="chengheng1"/> <!--参数1 uname-->
    <constructor-arg index="1">          <!--构造方法的参数2 hobbyList-->
       <list>
       <value>唱歌</value>
       <value>跳舞</value>
       <value>爬山</value>
       </list>
    </constructor-arg>
    <constructor-arg index="2">        <!--参数3 residenceMap-->
    <map>
          <entry key="dalian" value="大连"/>
          <entry key="beijing" value="北京"/>
          <entry key="shanghai" value="上海"/>
    </map>
    </constructor-arg>
    <constructor-arg index="3">                <!--参数4 alisSet-->
        <set>
             <value>陈恒100</value>
             <value>陈恒101</value>
             <value>陈恒102</value>
         </set>
    </constructor-arg>
    <constructor-arg index="4">               <!--参数5 array-->
       <array>
             <value>aaaaa</value>
             <value>bbbbb</value>  
       </array>
    </constructor-arg>
    </bean>
    <!-- 使用属性的Setter方法注入方式装配ComplexUser实例user2 -->
    <bean id="user2" class="assemble.ComplexUser">
      <property name="uname" value="chengheng2" />  
      <property name="hobbyList">
           <list>
             <value>看书</value>
             <value>学习</value>
           </list>
      </property>
      <property name="residenceMap">
           <map>
              <entry key="shenzhen" value="深圳"/>
              <entry key="guangzhou" value="广州"/>
              <entry key="tianjin" value="天津"/>
           </map>
      </property>
      <property name="aliasSet">
           <set>
               <value>陈恒103</value>
               <value>陈恒104</value>
               <value>陈恒105</value>
           </set>
      </property>
      <property name="array">
         <array>
             <value>cccccc</value>
             <value>dddddd</value>
         </array>
      </property>
     </bean>     
</beans>
   

测试类:

package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import assemble.ComplexUser;
public class TestAssemble {
	public static void main(String [] args) {
		ApplicationContext appCon=new ClassPathXmlApplicationContext("applicationContext.xml");
		//使用构造方法装配测试
		ComplexUser u1=(ComplexUser)appCon.getBean("user1");
		System.out.println(u1);
		//使用setter方法装配测试
		ComplexUser u2=(ComplexUser)appCon.getBean("user2");
		System.out.println(u2);
	}
}

运行结果:

uname=chengheng1;hobbyList=[唱歌, 跳舞, 爬山];residenceMap={dalian=大连, beijing=北京, shanghai=上海};aliasSet=[陈恒100, 陈恒101, 陈恒102];array=[Ljava.lang.String;@6340e5f0
uname=chengheng2;hobbyList=[看书, 学习];residenceMap={shenzhen=深圳, guangzhou=广州, tianjin=天津};aliasSet=[陈恒103, 陈恒104, 陈恒105];array=[Ljava.lang.String;@45099dd3

2.基于注解的装配

     在Spring框架中,如果有大量的bean需要装配,使用XML装配会导致XML文件过于庞大,所以使用注解的方式去装配bean更加方便。
bean的实现类:

package annotation;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Value;
@Component()
public class AnnotationUser {
      @Value("chenheng")
      private String uname;
      public void setUname(String uname) {
    	  this.uname=uname;
      }
      public String getUname() {
    	  return uname;
      }
}

配置文件:使用base-package说明包所在的路径,这样Spring容器才知道去哪里扫描bean对象。

 <?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 命名空间,通过spring 扫描指定包Annotation及其包下所有Bean的实现类,进行注解解析-->
     <context:component-scan base-package="annotation" />
</beans> 

测试类及运行结果:

package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import annotation.AnnotationUser;
public class TestAnnotation {
    public static void main(String [] args) {
    	ApplicationContext appCon=new ClassPathXmlApplicationContext("annotationContext.xml");
    	AnnotationUser au=(AnnotationUser)appCon.getBean("annotationUser");
    	System.out.println(au.getUname());
    }
}

运行结果:
chenheng

(1)@Component:该注解是一个泛化的概念,仅仅表示一个组件对象(bean)可以作用在任何层次上。
(2)@Repository(仓库):用于将数据访问层(DAO)的类标识为bean,即注解数据访问层bean,其功能和@Component相似。
(3)@Service:用于标注一个业务逻辑组件类(service层),其功能和@Component相似。
(4)@Controller:用于标注一个控制器组件(Spring MVC 的 Controller),其功能和@Component相似。
(5)@Autowired(自动连线):该注解可以对类成员变量,方法和构造方法进行标注,完成自动装配的工作,通过使用@Autowired 来消除setter和getting方法。默认按照bean的类型进行注解。
(6)@Resource:该注解与@Autowired的功能一样,区别在于该注解默认是按照名称来进行装配注入的,找不到与名称匹配的bean时才会按照类型来装配。想要按照名称来装配,需要@Resource和@Qualifier注解一起使用。@Resource注解有两个属性(name,type),name指定bean实例名称,即按照名称装配。type指定bean类型,即按照bean类型进行装配。
(7)@Qualifier:按照名称来装配,需要@Resource和@Qualifier注解一起使用。bean的实例名称由@Qualifier注解的参数指定。

     在注解中,@Repository,@Service ,@Controller等注解的功能和@Component的功能相同,但为了使类的标注更加清晰,推荐@Repository标注数据访问层(DAO层)、@Service标注业务逻辑层、@Controller标注控制器层。
(1)DAO层:

package annotation.dao;
public interface TestDao {
	public void save();

}

package annotation.dao;
import org.springframework.stereotype.Repository;
@Repository("testDao")   //相当于@Repository
public class TestDaoImpl implements TestDao{
	@Override
	public void save() {
		System.out.println("testDao save");
	}

}

(2)Service层

package annotation.service;
public interface TestService {
    public void save();
}

package annotation.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import annotation.dao.TestDao;
@Service("testService")   //相当于@Service
public class TestSeviceImpl implements TestService{
	@Resource(name="testDao")   //相当于@Autowired,@Autowired默认按照bean类型装配,@Resource按照名称进行装配
	private TestDao testDao;
	@Override
	public void save() {
		testDao.save();
		System.out.println("testService save");
	}

}

(3)Controller层

package annotation.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import annotation.service.TestService;
@Controller
public class TestController {
    @Autowired
    private TestService testService;
    public void save() {
    	testService.save();
    	System.out.println("testController save");
    }
}

(4)测试类及结果:

package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import annotation.controller.TestController;
public class TestMoreAnnotation {
	public static void main(String []args) {
		ApplicationContext appCon=new ClassPathXmlApplicationContext("annotationContext.xml");
		TestController testcon=(TestController)appCon.getBean("testController");
		testcon.save();
	}

}

结果:
testDao save
testService save
testController save

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页