接上篇
注入集合属性
主要为数组、List、Map集合
比较简单直接放例子
//Stu类
public class Stu {
//1 数组类型属性
private String[] courses;
//2 集合类型属性
private List<String> list;
//3 map类型属性
private Map<String,String> maps;
//4 set类型属性
private Set<String> sets;
public void setSets(Set<String> sets) {
this.sets = sets;
}
public void setCourses(String[] courses) {
this.courses = courses;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
@Override
public String toString() {
return "Stu{" +
"courses=" + Arrays.toString(courses) +
", list=" + list +
", maps=" + maps +
", sets=" + sets +
'}';
}
}
xml配置文件
//xml配置文件
<bean id="stu" class="com.qy.spring5.ListTest.Stu">
<!--数组属性注入-->
<property name="courses">
<array>
<value>java课程</value>
<value>数据库课程</value>
</array>
</property>
<!--list属性注入-->
<property name="list">
<list>
<value>大王</value>
<value>小王</value>
</list>
</property>
<!--map属性注入-->
<property name="maps">
<map>
<entry key="JAVA" value="java"></entry>
<entry key="MYSQL" value="mysql"></entry>
</map>
</property>
<!--set属性注入-->
<property name="sets">
<set>
<value>set1</value>
<value>set2</value>
</set>
</property>
</bean>
//测试类
@Test
public void testOrder(){
// 1 加载Spring配置文件
ApplicationContext context =
new ClassPathXmlApplicationContext("com/day3/spring5/ListTest/bean.xml");
// 2 获取配置创建的对象
Stu stu = context.getBean("stu", Stu.class);
// 3 输出配置创建的对象
System.out.println(stu);
}
记清楚每个集合重要的组件,这一部分就可以掌握
外部Bean注入
//Stu类
public class Stu {
private List<Course> course;
public void setCourse(List<Course> course) {
this.course = course;
}
public void test(){
System.out.println(course);
}
}
//Course类
public class Course {
private String cname;
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "Course{" +
"cname='" + cname + '\'' +
'}';
}
}
xml配置文件
//xml配置文件
<bean id="stu" class="com.day3.spring5.ListTest.Stu">
<property name="course">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
</bean>
<bean id="course1" class="com.day3.spring5.ListTest.Course">
<property name="cname" value="Sprng5框架"></property>
</bean>
<bean id="course2" class="com.qy.spring5.ListTest.Course">
<property name="cname" value="MyBatis框架"></property>
</bean>
IOC操作Bean管理(FactoryBean)
1、Spring有两种类型bean,一种普通bean,另一种工厂bean(FactoryBean)
2、普通bean:在配置文件中定义bean类型就是返回类型
3、工厂bean:在配置文件定义bean类型可以和返回类型不一样
接下来来讲讲实现步骤
第一步:创建工厂类,实现接口FactoryBean
//MyBean类
public class MyBean implements FactoryBean {
private String cname;
@Override
// 定义返回的类型为Course
public Course getObject() throws Exception {
Course course = new Course();
course.setCname("Java课程");
return course;
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return false;
}
}
//Course类
public class Course {
private String cname;
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
}
xml配置文件
<bean id="myBean" class="com.day4.spring5.MyBeanTest.MyBean"></bean>
测试类
//测试类
//会发现获取myBean的返回值已经变为了Course
@Test
public void test(){
//1 加载xml配置文件
ApplicationContext context =
new ClassPathXmlApplicationContext("com/day4/spring5/MyBeanTest/bean.xml");
//2 获取配置文件创建的对象
Course course = context.getBean("myBean", Course.class);
//3 输出获得的对象
System.out.println(course.getCname());
}
最后我们来说说作用域
在Spring中,默认情况下,bean都为单实例对象,可通过设置bean的属性scope设置多实例还是单实例。
scope属性值:
- 第一个值,默认值,singleton,表示单实例对象
- 第二个值,prototype,表示多实例对象
//测试类
@Test
public void testBook(){
// 1 加载Spring配置文件
ApplicationContext context =
new ClassPathXmlApplicationContext("com/qy/spring5/bean1.xml");
// 2 获取配置创建的对象
Book book1 = context.getBean("book",Book.class);
Book book2 = context.getBean("book",Book.class);
// 3 输出配置创建的对象的属性
System.out.println(book1);
System.out.println(book2);
}
//xml配置文件
<bean id="book" class="com.day4.spring5.Book" scope="prototype"></bean>
//测试类输出
com.qy.spring5.Book@365185bd
com.qy.spring5.Book@18bf3d14
// 发现创建的对象地址不同,说明创建了多实例对象