Spring基于XML装配Bean
1.set方法注入
2.构造方法注入
演示基于xml方式的Bean对不同类型数据的装配
package com.spring.demo1;
import java.util.*;
public class MyClass {
//演示基于xml方式的Bean对不提供类型数据的装配
//基本类型数据
private int intvalue;
private double doublevalue;
private char charvalue;
private boolean booleanvalue;
//String类型数据
private String stringvalue;
//时间日期
private Date datevalue;
//对象型
private ClassBean classBean;
//String类型数组
private String stringarr[];
//ClassBean类型数组
private ClassBean classarr[];
//String类型List
private List<String> stringList;
//ClassBean类型List集合
private List<ClassBean> classBeanList;
//String类型set集合
private Set<String> stringSet;
//ClassBean类型set集合
private Set<ClassBean> classBeanSet;
//String类型Map集合
private Map<String,String> stringMap;
//ClassBean类型Map集合
private Map<String,ClassBean> classBeanMap;
//properties
private Properties propertiesvalue;
public Properties getPropertiesvalue() {
return propertiesvalue;
}
public void setPropertiesvalue(Properties propertiesvalue) {
this.propertiesvalue = propertiesvalue;
}
public Map<String, ClassBean> getClassBeanMap() {
return classBeanMap;
}
public void setClassBeanMap(Map<String, ClassBean> classBeanMap) {
this.classBeanMap = classBeanMap;
}
public Map<String, String> getStringMap() {
return stringMap;
}
public void setStringMap(Map<String, String> stringMap) {
this.stringMap = stringMap;
}
public Set<ClassBean> getClassBeanSet() {
return classBeanSet;
}
public void setClassBeanSet(Set<ClassBean> classBeanSet) {
this.classBeanSet = classBeanSet;
}
public Set<String> getStringSet() {
return stringSet;
}
public void setStringSet(Set<String> stringSet) {
this.stringSet = stringSet;
}
public List<ClassBean> getClassBeanList() {
return classBeanList;
}
public void setClassBeanList(List<ClassBean> classBeanList) {
this.classBeanList = classBeanList;
}
public List<String> getStringList() {
return stringList;
}
public void setStringList(List<String> stringList) {
this.stringList = stringList;
}
public ClassBean[] getClassarr() {
return classarr;
}
public void setClassarr(ClassBean[] classarr) {
this.classarr = classarr;
}
public String[] getStringarr() {
return stringarr;
}
public void setStringarr(String[] stringarr) {
this.stringarr = stringarr;
}
public ClassBean getClassBean() {
return classBean;
}
public void setClassBean(ClassBean classBean) {
this.classBean = classBean;
}
public Date getDatevalue() {
return datevalue;
}
public void setDatevalue(Date datevalue) {
this.datevalue = datevalue;
}
public String getStringvalue() {
return stringvalue;
}
public void setStringvalue(String stringvalue) {
this.stringvalue = stringvalue;
}
public int getIntvalue() {
return intvalue;
}
public void setIntvalue(int intvalue) {
this.intvalue = intvalue;
}
public double getDoublevalue() {
return doublevalue;
}
public void setDoublevalue(double doublevalue) {
this.doublevalue = doublevalue;
}
public char getCharvalue() {
return charvalue;
}
public void setCharvalue(char charvalue) {
this.charvalue = charvalue;
}
public boolean isBooleanvalue() {
return booleanvalue;
}
public void setBooleanvalue(boolean booleanvalue) {
this.booleanvalue = booleanvalue;
}
}
package com.spring.demo1;
public class ClassBean {
private String classcode;
private String classname;
public String getClasscode() {
return classcode;
}
public void setClasscode(String classcode) {
this.classcode = classcode;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
}
<?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">
<!-- 创建SimpleDateFormat类对象 -->
<bean id="sdf" class="java.text.SimpleDateFormat">
<constructor-arg index="0" value="yyyy-MM-dd"></constructor-arg>
</bean>
<!-- 创建ClassBean类对象 -->
<bean id="calssbean1" class="com.spring.demo1.ClassBean">
<property name="classcode" value="2022-03-03"></property>
<property name="classname" value="Java班"></property>
</bean>
<bean id="calssbean2" class="com.spring.demo1.ClassBean">
<property name="classcode" value="2022-03-03"></property>
<property name="classname" value="前端班"></property>
</bean>
<bean id="myclass" class="com.spring.demo1.MyClass">
<!-- 使用set方法注入基本数据类型 -->
<property name="intvalue" value="1001"></property>
<property name="charvalue" value="S"></property>
<property name="doublevalue" value="12.5"></property>
<property name="booleanvalue" value="true"></property>
<!-- 使用set方法注入String数据 -->
<property name="stringvalue" value="张三"></property>
<!-- 使用set方法注入时间日期型数据 -->
<property name="datevalue" >
<bean factory-bean="sdf" factory-method="parse">
<constructor-arg index="0" value="2022-3-3"></constructor-arg>
</bean>
</property>
<!-- 使用set方法注入calssbean对象 -->
<property name="classBean" ref="calssbean1"></property>
<!-- 使用set方法注入String类型数组 -->
<property name="stringarr" >
<array>
<value>张三</value>
<value>李四</value>
<value>王五</value>
</array>
</property>
<!-- 使用set方法注入ClassBean类型数组 -->
<property name="classarr">
<array>
<ref bean="calssbean1"></ref>
<ref bean="calssbean2"></ref>
</array>
</property>
<!-- 使用set方法注入String类型List -->
<property name="stringList">
<list>
<value>stringlist1</value>
<value>stringlist2</value>
<value>stringlist3</value>
</list>
</property>
<!-- 使用set方法注入ClassBean类型的List-->
<property name="classBeanList">
<list>
<ref bean="calssbean1"></ref>
<ref bean="calssbean2"></ref>
</list>
</property>
<!-- 使用set方法注入String类型的List-->
<property name="stringSet">
<set>
<value>stringset1</value>
<value>stringset2</value>
<value>stringset3</value>
</set>
</property>
<!-- 使用set方法注入ClassBean类型的List-->
<property name="classBeanSet">
<set>
<ref bean="calssbean1"></ref>
<ref bean="calssbean2"></ref>
</set>
</property>
<!-- 使用set方法注入String类型的Map-->
<property name="stringMap">
<map>
<entry key="name1" value="张三"></entry>
<entry key="name2" value="李四"></entry>
</map>
</property>
<!-- 使用set方法注入ClassBean类型的Map-->
<property name="classBeanMap">
<map>
<entry key="c1" value-ref="calssbean1"></entry>
<entry key="c2" value-ref="calssbean2"></entry>
</map>
</property>
<!-- 使用set方法注入ClassBean类型的Map-->
<property name="propertiesvalue">
<props>
<prop key="myname">root</prop>
<prop key="myname">123456</prop>
</props>
</property>
</bean>
</beans>
package com.spring.demo1;
import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.text.SimpleDateFormat;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class TestMain {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
MyClass myClass= ac.getBean("myclass",MyClass.class);
System.out.println("intvalue="+myClass.getIntvalue());
System.out.println("doublevalue="+ myClass.getDoublevalue());
System.out.println("charvalue="+myClass.getCharvalue());
System.out.println("booleanvalue="+myClass.isBooleanvalue());
System.out.println("Stringvalue="+myClass.getStringvalue());
System.out.println("datevalue="+new SimpleDateFormat("yyyy-MM-dd").format(myClass.getDatevalue()));
System.out.println("ClassBean="+myClass.getClassBean().getClasscode());
System.out.println("*******************************************************");
System.out.println("String类型数组*******************************************************");
for(String str:myClass.getStringarr()){
System.out.println("stringarr="+str);
}
System.out.println("ClassBean类型数组****************************************************");
for (ClassBean classBean:myClass.getClassarr()){
System.out.println(classBean.getClasscode());
System.out.println(classBean.getClassname());
}
System.out.println("String类型List*******************************************************");
for (String stringlist:myClass.getStringList()){
System.out.println(stringlist);
}
System.out.println("ClassBean类型List*****************************************************");
for (ClassBean classBeanlist:myClass.getClassBeanList()){
System.out.println(classBeanlist.getClasscode());
System.out.println(classBeanlist.getClassname());
}
System.out.println("String类型set**********************************************************");
for(String stringset:myClass.getStringSet()){
System.out.println(stringset);
}
System.out.println("ClassBean类型set*****************************************************");
for(ClassBean classbeanset:myClass.getClassBeanSet()){
System.out.println(classbeanset.getClasscode());
System.out.println(classbeanset.getClassname());
}
System.out.println("String类型Map*****************************************************");
for(Map.Entry<String,String> entry :myClass.getStringMap().entrySet()){
System.out.println(entry.getKey()+"="+entry.getValue());
}
System.out.println("ClassBean类型Map*****************************************************");
for (Map.Entry<String,ClassBean> entry : myClass.getClassBeanMap().entrySet()){
System.out.println(entry.getKey()+"="+entry.getValue().getClasscode());
System.out.println(entry.getKey()+"="+entry.getValue().getClassname());
}
System.out.println("Properties类型*****************************************************");
Properties properties= myClass.getPropertiesvalue();
Set<String> keyset= properties.stringPropertyNames();
for(String name:keyset){
String value=properties.getProperty(name);
System.out.println(name+"="+value);
}
}
}
2.基于注解的注入方式
在Spring中,尽管使用XML配置文件可以实现Bean的装配工作,但如果应用中Bean的数量较多,会导致XML配置文件过于臃肿,从而给维护和生活及带来一定困难
Java从JDK5.0以后,提供了Annotation(注解)功能,Spring也提供了对Annotation全面支持。Spring3中定义了一系列的Annotation(注解),常用的注解如下。
@Component---此注解描述Spring中的Bean【创建对象】,但它是一个泛化的概念,仅仅表示一个组件(Bean),并且可以作用在任何层次【控制层/业务层/数据访问层】
使用时只需将该注解标注在相应类上即可。
@Component--默认使用@Component创建的Bean类的名称,首字母小写
@Component(name)--指定的名称
package com.spring.demo1;
import org.springframework.stereotype.Component;
@Component
public class PersonBean {
public String testPerson(){
return "PersonBean类";
}
}
package com.spring.demo1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class StudentBean {
@Autowired
private PersonBean personBean;
public void testStudentBean(){
System.out.println("StudenBean的实例方法"+personBean.testPerson());
}
}
<?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.spring.demo1"></context:component-scan>
</beans>
@Autowried---完成依赖注入,默认按照Bean的类型进行装配依赖注入Bean的属性变量,属性的Set方法及构造函数进行标注
package com.spring.demo2;
import org.springframework.stereotype.Component;
@Component("student")
public class StudentBean {
public String getStringInfo(){
return "张三";
}
}
package com.spring.demo2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.annotation.Resources;
@Component("person")
public class PersonBean {
@Autowired
private StudentBean studentBean;
public void testPersonBean(){
System.out.println("PersonBean的实例方法+"+studentBean.getStringInfo());
}
}
<?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.spring.demo2"></context:component-scan>
</beans>
@Resource---完成依赖注入,先按Bean实例名称装配后,按照Bean类型进行装配
@Resource中有两个重要属性:name和type。
如果指定name属性,则按实例名称进行装配
如果指定type属性,则按Bean类型进行装配
如果不指定,则按Bean实例名称装配,如果不能匹配,则再按照Bean类型进行装配
如果都无法匹配,则抛出NoSuchBeanDefinitionException异常。
package com.spring.demo2;
import org.springframework.stereotype.Component;
@Component("student1")
public class StudentBean {
public String getStringInfo(){
return "张三";
}
}
package com.spring.demo2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.annotation.Resources;
@Component("person")
public class PersonBean {
@Resource(name = "student1")
private StudentBean studentBean;
public void testPersonBean(){
System.out.println("PersonBean的实例方法+"+studentBean.getStringInfo());
}
}
<?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.spring.demo2"></context:component-scan>
</beans>
@Qualifier---与@Autowried注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定
@Repository---用于将数据访问层(DAO层)的类表示为Spring中的Bean,其功能与@Compoment相同
@Repository---默认使用@Repository-创建的Bean类的名称, 首字母小写
@Repository(name)---指定的名称
@Service---作用再业务层(Service层),用于将业务层的类表示为Spring中 Bean,其功能与@Component相同。
@Service ---默认使用@Service创建的Bean类的名称,首字母小写
@Service(name)---指定的名称
@Controller---通常作用在控制层 (如 Struts2 的 Action/SpringMVC的控制器类),
用于将控制层的类标识为Spring中的Bean,其功能与@Componet相同
@Controller--默认使用@Controller创建的Bean类的名称,首字母小写
@Controller(name)--指定的名称
@Component---默认使用@Repository/@Service/@Controller
package com.spring.demo3.dao;
public interface PersonDao {
void insertPerson();
}
package com.spring.demo3.dao.impl;
import com.spring.demo3.dao.PersonDao;
import org.springframework.stereotype.Repository;
@Repository("personDao")
public class PersonDaoImpl implements PersonDao {
@Override
public void insertPerson() {
System.out.println("数据访问层实现类---insertPerson");
}
}
package com.spring.demo3.service;
public interface PersonService {
void addPerson();
}
package com.spring.demo3.service.impl;
import com.spring.demo3.dao.PersonDao;
import com.spring.demo3.service.PersonService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("personService")
public class PersonServiceImpl implements PersonService {
@Resource
private PersonDao personDao;
@Override
public void addPerson() {
System.out.println("业务访问接口实现类---addPerson");
personDao.insertPerson();
}
}
package com.spring.demo3.controller;
import com.spring.demo3.service.PersonService;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
@Controller("personController")
public class PersonCpntroller {
@Resource
private PersonService personService;
public void testPerson(){
System.out.println("控制层操作列---testPerson");
personService.addPerson();
}
}
Spring自动装配Bean
byName---根据成员变量的name自动装配,如果类对象名称和另一个类中的成员变量name相同,则自动装配
package com.spring.demo1;
import org.springframework.stereotype.Component;
public class PersonBean {
public String testPerson(){
return "PersonBean类";
}
}
package com.spring.demo1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class StudentBean {
private PersonBean personBean;
public PersonBean getPersonBean() {
return personBean;
}
public void setPersonBean(PersonBean personBean) {
this.personBean = personBean;
}
public void testStudentBean(){
System.out.println("StudenBean的实例方法"+personBean.testPerson());
}
}
<bean id="personBean" class="com.spring.demo1.PersonBean"></bean>
<bean id="student" class="com.spring.demo1.StudentBean" autowire="byName"></bean>
byType---根据成员变量的数据类型自动装配,如果类的数据类型与另一个类中的数据类型兼容,则自动装配
<bean id="person" class="com.spring.demo1.PersonBean"></bean>
<bean id="student" class="com.spring.demo1.StudentBean" autowire="byType"></bean>
constructor---根据构造方法的参数数据类型,进行byType模式的自动装配
<bean id="person" class="com.spring.demo1.PersonBean"></bean>
<bean id="student" class="com.spring.demo1.StudentBean" autowire="constructor"></bean>
autodetect---如果发现默认的构造方法,则用constructor模式,否则用byType模式---Spring3.0以后被淘汰
no---默认情况下,不使用自动床配,Bean依赖必须通过ref元素定义。