【Spring】IOC操作bean管理(一)——bean管理实例详解(XML、FactoryBean)

31 篇文章 0 订阅
12 篇文章 0 订阅

【Spring系列】IOC控制反转

【Spring系列】IOC操作bean管理(一)——bean管理实例详解

【Spring系列】IOC操作bean管理(二)——bean的生命周期、作用域

【Spring系列】IOC操作bean管理(三)——xml自动装配

【Spring系列】IOC操作bean管理(四)——引入外部属性文件

【Spring系列】IOC操作bean管理(五)——bean管理注解

【Spring系列】AOP详解

【Spring系列】JdbcTemplate操作数据库详解

【Spring系列】spring事务配置详解

【Spring系列】spring5框架新特性



一、Bean管理是什么

(1)Spring创建对象

(2)Spirng注入属性

二、Bean管理操作方式

(一)Bean管理xml

(1)基于xml创建对象

	<!--例如:创建dao对象-->
    <bean id="userDaoImpl" class="com.springlearn.dao.UserDaoImpl"></bean>

(2)基于xml注入属性

1)在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建;

2)bean标签常用属性:

  • id属性:唯一标识
  • class属性:类全路径(包类路径)
  • scope属性:单例 singleton 多例 pototype (默认是单例)

3)创建对象时候,默认调用无参数构造方法完成对象创建;

① 使用set方法:

实体类:

public class Book {
    private String bname;
    private String bauthor;

    public void setBname(String bname) {
        this.bname = bname;
    }

    public void setBauthor(String bauthor) {
        this.bauthor = bauthor;
    }
}

原始方法:

public class Main {

    @Resource
    public static void main(String[] args) {
        Book book = new Book();
        book.setBname("");
        book.setBauthor("");
    }
}

使用xml文件:
无需原始方法

<?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">
       
	<!--使用set方法注入属性-->
    <bean id="book" class="com.springlearn.entity.Book">
       <!--使用property完成属性注入
        name:类里面属性名称
        value:向属性注入的值
       -->
     	<property name="bname" value="Spring学习"></property>
        <property name="bauthor" value="肥宅快乐鼠"></property>
    </bean>

</beans>
②使用有参构造:

实体类:

public class Order {

    private String oid;
    private String oname;

    //生成有参构造
    public Order(String oid, String oname) {
        this.oid = oid;
        this.oname = oname;
    }
}

原始方法:

public class Main {

    public static void main(String[] args) {
        Order order = new Order("", "");
    }
}

使用有参构造:
无需原始方法

<?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>
    <!--使用有参构造方法注入属性-->
    <bean id="order" class="com.springlearn.entity.Order">
        <constructor-arg name="oid" value="123"></constructor-arg>
        <constructor-arg name="oname" value="书本"></constructor-arg>
    </bean>

</beans>
③ 使用p名称空间:

xml文件:

<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="book" class="com.springlearn.entity.Book" p:bname="课本" p:bauthor="肥宅快乐鼠"></bean>
    
</beans>

(3)基于xml注入其他类型属性

1)注入null或特殊符号
1:如果有null值

<null/>

    <bean id="book" class="com.springlearn.entity.Book">
        <property name="bname" value="Spring学习"></property>
        <property name="bauthor">
            <null/>
        </property>
    </bean>
2:如果包含特殊符号

<value><![CDATA[特殊符号属性]]></value>

转义 &lt; &gt;

<property name="address">
    <value><![CDATA[<<spring学习>>]]></value>
</property>

2)注入外部bean(注入对象类型属性)
  • 创建对象

(1)创建两个类 service类和dao接口和实现类
在这里插入图片描述

UserDao:

public interface UserDao {
    public void addUser();
}

UserDaoImpl:

public class UserDaoImpl implements UserDao{
    @Override
    public void addUser() {
        System.out.println("UserDao类的addUser方法……");
    }
}

(2)在spring配置文件中进行配置
其实底层也是使用了set方法

UserService:

public class UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void addUserService(){

    }
}

<?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">
    
    <!--创建service对象-->
    <bean id="userService" class="com.springlearn.service.UserService">
		<property name="userDao" ref="userDaoImpl"></property>
	</bean>

    <!--创建dao对象-->
    <bean id="userDaoImpl" class="com.springlearn.dao.UserDaoImpl"></bean>

</beans>

(3)在service调用dao里面的方法

public class UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void addUserService(){
        userDao.addUser();

    }
}
3)注入内部bean
第一种:普通写法
  • 管理对象之间关系

(1)创建实体类

public class Emp {
    private String eno;
    private String ename;

    //表示所属部门
    private Dept dept;

    public String getEno() {
        return eno;
    }

    public void setEno(String eno) {
        this.eno = eno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "eno='" + eno + '\'' +
                ", ename='" + ename + '\'' +
                ", dept=" + dept +
                '}';
    }

    public void prints(){
        System.out.println(eno +"——"+ename+"——"+dept);
    }
}

public class Dept {
    private String dname;

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "dname='" + dname + '\'' +
                '}';
    }
}

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

name属性:实体类中属性的名称
ref属性:bean标签的id值

<?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="emp" class="com.springlearn.entity.Emp">
        <!--设置普通属性-->
        <property name="eno" value="123"></property>
        <property name="ename" value="jack"></property>

		<!--级联赋值-->
        <!--设置员工所属部门-->
        <property name="dept" ref="dept"></property>
    </bean>
    
    <bean id="dept" class="com.springlearn.entity.Dept">
		<property name="dname" value="技术部"></property>
	</bean>
</beans>

(3)测试类

public class TestSpring {

    @Test
    public void testEmp(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Emp emp = context.getBean("emp", Emp.class);
        emp.prints();
    }
}

结果:

在这里插入图片描述

第二种:将对象写在属性标签里面

只是xml文件不同,这种是将bean标签写在property标签里面,来设置对象的属性。

<?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="emp" class="com.springlearn.entity.Emp">
        <!--设置两个普通属性-->
        <property name="eno" value="rose"></property>
        <property name="ename" value="456"></property>
        
        <!--设置对象类型属性-->
        <property name="dept">
            <bean id="dept" class="com.springlearn.entity.Dept">
                <property name="dname" value="设计部"></property>
            </bean>
        </property>
        
    </bean>
</beans>

结果:
在这里插入图片描述

第三种:级联赋值

注意: 需要生成级联赋值对象的get方法,因为要先得到对象之后才能赋值。

<?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="emp" class="com.springlearn.entity.Emp">
        <!--设置两个普通属性-->
        <property name="ename" value="lucy"></property>
        <property name="eno" value="789"></property>
        <!--级联赋值-->
        <!--先创建对象-->
        <property name="dept" ref="dept"></property>
        <!--再注入属性-->
        <property name="dept.dname" value="宣传部"></property>
    </bean>
    <bean id="dept" class="com.springlearn.entity.Dept"></bean>
</beans>

结果:
在这里插入图片描述

4)注入集合

实体类:

  • 创建类,定义数组、list、map、set类型属性,生成对应set方法;
package com.springlearn.entity;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class CollectionEntity {

    //数组类型
    private String[] arrs;

    //list
    private List<String> lists;

    //map
    private Map<String,String> maps;

    //set
    private Set<String> sets;

    public void setArrs(String[] arrs) {
        this.arrs = arrs;
    }

    public void setLists(List<String> lists) {
        this.lists = lists;
    }

    public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }

    public void setSets(Set<String> sets) {
        this.sets = sets;
    }

    public void prints(){
        System.out.println(Arrays.toString(arrs));
        System.out.println(lists);
        System.out.println(maps);
        System.out.println(sets);
    }
}

xml文件:

  • 在spring配置文件进行配置;
<?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="collection" class="com.springlearn.entity.CollectionEntity">
        <!--注入数组-->
        <property name="arrs">
            <array>
                <value>aaa</value>
                <value>bbb</value>
                <value>ccc</value>
            </array>
        </property>

        <!--注入list-->
        <!--也可以使用array标签-->
        <property name="lists">
            <list>
                <value>好好</value>
                <value>学习</value>
            </list>
        </property>

        <!--注入set-->
        <property name="sets">
            <set>
                <value>天天</value>
                <value>向上</value>
            </set>
        </property>

        <!--注入map-->
        <!--使用key-ref属性 可以引入其他对象-->
        <property name="maps">
            <map>
                <entry key="yy" value="永远"></entry>
                <entry key="ds" value="的神"></entry>
            </map>
        </property>
    </bean>


</beans>

测试类:

package com.springlearn.test;

import com.springlearn.entity.CollectionEntity;
import com.springlearn.entity.Emp;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring {

    @Test
    public void testCollection(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        CollectionEntity collection = context.getBean("collection", CollectionEntity.class);
        collection.prints();
    }
}

结果:

在这里插入图片描述

三、FactoryBean

  • Spring有两种类型bean
  • 1:普通bean
  • 2:工厂bean(FactoryBean)

(1)区别:

1、普通bean:在配置文件中定义bean类型就是返回类型;

3、工厂bean:在配置文件定义bean类型可以和返回类型不同(也可以相同);

(2)实现步骤

第一步:创建类,让这个类作为工厂bean,实现接口 FactoryBean

public class MyBean implements FactoryBean<Course> {

}

第二步:实现接口里面的方法,在实现的方法中定义返回的bean类型

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

第三步:配置xml文件

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

第四步:编写测试类

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


感谢阅读哇~

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cakeAndAle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值