Spring学习笔记(三)

接上篇

注入集合属性

主要为数组、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
 
// 发现创建的对象地址不同,说明创建了多实例对象
posted @ 2021-08-02 17:37  Emuaer  阅读(35)  评论(0编辑  收藏  举报