Spring5入门-----IOC 操作 Bean 管理(1)----Spring5的@Test注解引入

本文详细介绍了Spring5中的IOC操作Bean管理,包括XML注入其他类型属性、集合属性、FactoryBean的使用,以及@Test注解的引入。内容涵盖了bean的作用域设置,如singleton和prototype的区别,以及如何通过xml配置进行各种类型的属性注入。


IOC 操作 Bean 管理


IOC 操作 Bean 管理(xml 注入其他类型属性)

1、字面量

(1)null 值

<!--null-->
<property name="address">
 <null/>
</property>

(2)属性值包含特殊符号

<!--属性值包含特殊符号
 1<>进行转义 &lt; &gt;
 2 把带特殊符号内容写到 CDATA
-->
<property name="address">
 <value><![CDATA[<<南京>>]]></value>
</property>

2、注入属性-外部 bean

(1)创建两个类 service 类和 dao 类
(2)在 service 调用 dao 里面的方法 (

public class UserService {
 //创建 UserDao 类型属性,生成 set 方法
 private UserDao userDao;
 public void setUserDao(UserDao userDao) {
 this.userDao = userDao;
 }
 public void add() {
 System.out.println("service add...............");
 userDao.update();
 }
}

(3)在 spring 配置文件中进行配置

    <!--注入userDao对象  name属性: 类里属性名称   ref属性:创建userDao对象bean标签id值 -->
   <property name="userDao" ref="userDaoIml"></property>
    </bean>
    <!--接口实现类-->
    <bean id="userDaoIml" class="com.NS.spring5.dao.UserDaoIml"></bean>

3、注入属性-内部 bean

(1)一对多关系:部门和员工 一个部门有多个员工,一个员工属于一个部门 部门是一,员工是多。
(2)在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示

//部门类
public class Dept {
 private String dname;
 public void setDname(String dname) {
 this.dname = dname;
 }
}
//员工类
public class Emp {
 private String ename;
 private String gender;
 //员工属于某一个部门,使用对象形式表示
 private Dept dept;
 public void setDept(Dept dept) {
 this.dept = dept;
 }
 public void setEname(String ename) {
 this.ename = ename;
 }
 public void setGender(String gender) {
 this.gender = gender;
 }
 }

(3)在 spring 配置文件中进行配置

    <bean id="emp" class="com.NS.spring5.bean.Emp">
    <property name="ename" value="tom"></property>
    <property name="gender" value="女"></property>
    <!--设置对象类型属性-->
    <property name="dept">
    <bean id="dept" class="com.NS.spring5.bean.Dept">
        <property name="dname" value="保安部"</property>
    </bean>
    </property>
</bean>

4、注入属性-级联赋值
(1)第一种写法

<!--级联赋值-->
<bean id="emp" class="com.NS.spring5.bean.Emp">
 <!--设置两个普通属性-->
 <property name="ename" value="lucy"></property>
 <property name="gender" value="女"></property>
 <!--级联赋值-->
 <property name="dept" ref="dept"></property>
</bean>

<bean id="dept" class="com.NS.spring5.bean.Dept">
 <property name="dname" value="财务部"></property>
</bean>

(2)第二种写法

<!--级联赋值-->
<bean id="emp" class="com.NS.spring5.bean.Emp">
 <!--设置两个普通属性-->
 <property name="ename" value="lucy"></property>
 <property name="gender" value="女"></property>
 <!--级联赋值-->
 <property name="dept" ref="dept"></property>
 <property name="dept.dname" value="技术部"></property>
</bean>
<bean id="dept" class="com.NS.spring5.bean.Dept">
 <property name="dname" value="财务部"></property>
</bean>

IOC 操作 Bean 管理(xml 注入集合属性)

1、注入数组类型属性
2、注入 List 集合类型属性
3、注入 Map 集合类型属性

(1)创建类,定义数组、list、map、set 类型属性,生成对应 set 方法

public class stu {
    private String [] course;
    private List<String> list;
    private Map<String ,String> map;
    private Set<String> set;
    private  List<Course> coursesList;
    public void setCoursesList(List<Course> courses) {
        this.coursesList = courses;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setCourse(String[] course) {
        this.course = course;
    }
    public void add(){
        System.out.println(Arrays.toString(course));
        System.out.println(list);
        System.out.println(map);
        System.out.println(set);
        System.out.println(coursesList);
    }
}

(2)在 spring 配置文件进行配置

<bean id="stu" class="com.NS.collectiontype.stu">
    <property name="course">
        <list>
            <value>Java</value>
            <value>数据库</value>
        </list>
    </property>
    <property name="map">
        <map>
            <entry key="JAVA" value="java"></entry>
            <entry key="PHP" value="php"></entry>
        </map>
    </property>

    <property name="set">
        <set>
            <value>MYSQl</value>
            <value>Redis</value>
        </set>
    </property>

    <property name="list">
        <list>
            <value>张三</value>
            <value>李四</value>
        </list>
    </property>

      <property name="coursesList">
          <list>
              <ref bean="course2"></ref>
              <ref bean="course1"></ref>
          </list>
      </property>
 </bean>
    
    <bean id="course1" class="com.NS.collectiontype.Course">
        <property name="course"  value="Spring5"></property>
    </bean>

    <bean id="course2" class="com.NS.collectiontype.Course">
        <property name="course" value="MyBatis"></property>
    </bean>

4、把集合注入部分提取出来

(1)在 spring 配置文件中引入名称空间 util

<?xml version="1.0" encoding="UTF-8"?>
<!--1)在 spring 配置文件中引入名称空间 util-->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:util="http://www.springframework.org/schema/util"
       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
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util.xsd">

    <!--使用 util 标签完成 list 集合注入提取-->
    <util:list id="booklist">
        <value>易筋经</value><value>九阳真经</value><value>九阳神功</value>
    </util:list>
<!--
 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象
  设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用
   getBean 方法时候创建多实例对象
-->

    <!--提取 list 集合类型属性注入使用-->
    <!--scope 属性值
      第一个值  默认值,singleton,表示是单实例对象
      `第二个值  prototype,表示是多实例对象 -->
    <bean id="book" class="com.NS.collectiontype.Book" scope="prototype">
        <property name="course" ref="booklist"></property>
    </bean>
</beans>

IOC 操作 Bean 管理(FactoryBean)

1、Spring 有两种类型 bean
一种普通 bean,另外一种工厂 bean(FactoryBean)
2、普通 bean:在配置文件中定义 bean 类型就是返回类型
3、工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样

第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型

public class Mybean implements FactoryBean<Course> {
    @Override
    //定义返回bean
    public Course getObject() throws Exception {
        Course course=new Course();
        course.setCourse("abc");
        return course;
    }
    
    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

<bean id="myBean" class="com.atguigu.spring5.factorybean.MyBean">
</bean>

Spring5的@Test注解引入

Project Structure(快捷键 Ctrl + Alt + Shift + s),点击Project Structure界面左侧的“Modules”
在这里插入图片描述
点击右边绿色的 “+”号,选择第一个选项“JARs or directories…”,选择相应的jar包(IDEA的安装目录\lib\junit-4.11.jar,hamcrest-core-1.3.jar,junit.jar),点“OK”,jar包添加成功。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@Test
public void test3() {
 ApplicationContext context =
 new ClassPathXmlApplicationContext("bean3.xml");
 Course course = context.getBean("myBean", Course.class);
 System.out.println(course);
}

IOC操作Bean管理(bean 作用域 )

1、在 Spring 里面,设置创建 bean 实例是单实例还是多实例

2、在 Spring 里面,默认情况下,bean 是单实例对象

  @Test
    public void test1(){
        ApplicationContext context=new
                ClassPathXmlApplicationContext("bean2.xml");
        Book book2=context.getBean("book",Book.class);
        Book book1=context.getBean("book",Book.class);
        System.out.println(book2);
        System.out.println(book1);
    }

类型相同
3、如何设置单实例还是多实例
(1)在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例
(2)scope 属性值
第一个值 默认值,singleton,表示是单实例对象
第二个值 prototype,表示是多实例对象

    <!--提取 list 集合类型属性注入使用-->
    <!--scope 属性值
      第一个值  默认值,singleton,表示是单实例对象
      `第二个值  prototype,表示是多实例对象 -->
    <bean id="book" class="com.NS.collectiontype.Book" scope="prototype">
        <property name="course" ref="booklist"></property>
    </bean>

(3)singleton 和 prototype 区别

第一 singleton 单实例,prototype 多实例
第二 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象
设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用
getBean 方法时候创建多实例对象

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值