Setter注入
1、最常用的注入方法,需要在xml文件中手动配置。
2、要求:需要对象中需要注入值的属性都有setter方法
3、如何配置?
为对象的每个属性配置一个property标签,<property name="" />
4、对象中的属性分为几种类型,不同的类型需要使用不同的注入方式
1.简单数据类型(八大基本类型,String,BigDecimal,Date等),使用value。会自动进行类型转换。
2.引用数据类型,使用ref。ref的值为Spring容器中已经存在的对象的名字。
3.集合数据类型,需要将property属性展开,对于不同类型的结合,是用其对应的标签进行注入。
5、代码示例:
在pom.xml中导入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.test</groupId> <artifactId>spring02</artifactId> <version>1.0.0</version> <properties> <project.spring.version>5.0.0.RELEASE</project.spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${project.spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${project.spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${project.spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${project.spring.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> </build> </project>
@Setter public class Student { private String name; private Integer age; private Date birthday; private Teacher teacher; }
@Setter public class Teacher { private String name; }
@Setter public class TestBean { private Set<String> set; private List<String> list; private String[] strrs; private Map<String,Student> map; private Properties prop; @Override public String toString() { return "TestBean{" + "set=" + set + ", list=" + list + ", strrs=" + Arrays.toString(strrs) + ", map=" + map + ", prop=" + prop + '}'; } }
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class App { @Autowired private TestBean testBean; @Test public void testBean(){ System.out.println(testBean); } }
<?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"> <bean id="student" class="com.test.test01_setter.Student"> <!--简单类型对象赋值使用property的name和value即可--> <property name="age" value="22"/> <property name="birthday" value="2018/2/2"/> <property name="name" value="qq"/> <!--引用类型数据,使用property标签的ref属性,引用容器中已经存在的一个对象--> <property name="teacher" ref="teacher"/> </bean> <bean id="teacher" class="com.test.test01_setter.Teacher"> <property name="name" value="rose"/> </bean> <bean id="testBean" class="com.test.test01_setter.TestBean"> <!--为集合类型数据赋值,使用property标签,然后使用对应类型的各自的标签 set集合使用set-value list集合使用list -value 数组使用array-value map使用map-entry中的key-value,都写在标签里 properties使用props-prop中的key,注意prop的值写在标签之间 --> <property name="set"> <set> <value>set1</value> <value>set1</value> <value>set1</value> </set> </property> <property name="list"> <list> <value>list1</value> <value>list1</value> <value>list1</value> </list> </property> <property name="strrs"> <array> <value>str1</value> <value>str1</value> <value>str1</value> </array> </property> <!--value-ref:为引用类型对象赋值,引用容器中已经存在的一个对象--> <property name="map"> <map> <entry key="we" value-ref="student"></entry> <entry key="ww" value-ref="student"></entry> </map> </property> <property name="prop"> <props> <prop key="prop">prop</prop> <prop key="prop1">prop</prop> <prop key="prop2">prop</prop> </props> </property> </bean> </beans>
构造器注入
1、利用构造函数为对象中的属性注入值,需要在xml文件中手动配置
2、要求:对象中必须存在需要注入值的元素的构造函数。
3、如何配置?
需要为对象中需要注入值的每个属性配置一个“constructor-arg”标签:<constructor-arg name='"/>
其中name属性的值为构造函数中形参的名字,给属性注入值时需要确定属性的类型
4、对象的属性分为三种类型,不同的类型使用不同的注入方式
1.简单数据类型(八大基本类型,String,BigDecimal,Date等),使用value。会自动进行类型转换。
2.引用数据类型,使用ref。ref的值为Spring容器中已经存在的对象的名字。
3.集合数据类型,需要将property属性展开,对于不同类型的结合,是用其对应的标签进行注入。
5、代码示例 pom.xml同上
public class Dog { }
public class People { private String name; private int age; private Dog dog; private Map<String,String> map; @Override public String toString() { return "People{" + "name='" + name + '\'' + ", age=" + age + ", dog=" + dog +",map="+map+ '}'; } public People(String name, int age, Dog dog,Map map) { this.name = name; this.age = age; this.dog = dog; this.map=map; } }
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class App { @Autowired private People people; @Test public void testPeople(){ System.out.println(people); } }
<?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"> <bean id="dog" class="com.test.test02_constructor.Dog"/> <!--构造函数设置参数的方法基本上与setter方法一致,只是property换成了constructor-arg--> <bean id="people" class="com.test.test02_constructor.People"> <constructor-arg name="name" value="qq"/> <constructor-arg name="age" value="11"/> <constructor-arg name="dog" ref="dog"/> <constructor-arg name="map"> <map> <entry key="ww" value="1234"/> <entry key="qq" value="1234"/> </map> </constructor-arg> </bean> </beans>