Resumen de aprendizaje de primavera (cuatro): Bean ensamblador basado en XML (2)

Uno, inyecte valores nulos y símbolos especiales.

1. Inyectar un valor nulo

       (1) Cree la clase de entidad Usuario, proporcione el nombre de los atributos privados, la edad y la dirección, y proporcione su método de conjunto y toString ().

public class User {
    private String name;
    private Integer age;
    private String address;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
   
}

       (2) Configure el objeto Usuario en bean.xml, inyecte el nombre y la edad, y establezca la dirección en nula.

<!--  向属性注入null值  -->
    <bean id="user" class="com.yht.example1.entity.User">
        <property name="name" value="刘备"></property>
        <property name="age" value="23"></property>
        <property name="address">
            <null></null>
        </property>
    </bean>

       (3) Realice pruebas unitarias.

    @Test
    public void testNull(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
        User user = (User) context.getBean("user");
        System.out.println(user);
    }

       Los resultados de la ejecución son los siguientes:

       Nota: nulo y "" no son lo mismo. Si el valor de la dirección se establece en "" , el resultado de la ejecución es el siguiente:

    <bean id="user" class="com.yht.example1.entity.User">
        <property name="name" value="刘备"></property>
        <property name="age" value="23"></property>
        <property name="address" value=""></property>
    </bean>

 

2. Inyectar símbolos especiales

       Hay dos formas de inyectar símbolos especiales: una es usar caracteres de escape, como & lt, & gt, etc .; la otra es usar CDATA para completar, simplemente escriba el contenido de los símbolos especiales en CDATA. Ahora suponga que al inyectar un valor en la propiedad bName de la clase Book, agregue el número de título del libro "". La implementación es la siguiente:

       (1) Cree la clase Book, proporcione los atributos bName y bAuthor y proporcione la estructura del parámetro.

public class Book {
    private String bName;
    private String bAuthor;

    public Book(String bName, String bAuthor) {
        this.bName = bName;
        this.bAuthor = bAuthor;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bName='" + bName + '\'' +
                ", bAuthor='" + bAuthor + '\'' +
                '}';
    }
}

       (2) Inyección de atributos en bean.xml.

    <!-- 向属性注入特殊字符:使用转义字符   -->
    <bean id="book1" class="com.yht.example1.entity.Book">
        <constructor-arg name="bName" value="&lt;&lt;三国演义&gt;&gt;"></constructor-arg>
        <constructor-arg name="bAuthor" value="罗贯中"></constructor-arg>
    </bean>
    <!-- 向属性注入特殊字符: CDATA  -->
    <bean id="book2" class="com.yht.example1.entity.Book">
        <constructor-arg name="bName">
            <value><![CDATA[<<水浒传>>]]></value>
        </constructor-arg>
        <constructor-arg name="bAuthor" value="施耐庵"></constructor-arg>
    </bean>

        (3) Realice pruebas unitarias.

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

       Los resultados de la ejecución son los siguientes:

Dos, inyección de atributos

1, frijol externo

       La forma del bean externo es apuntar la instancia configurada en bean.xml a través del atributo ref . Simplemente implementemos el proceso de UserService y UserDao a través de Spring.

       (1) Cree dos clases UserService y UserDao respectivamente.

public class UserService {
    private UserDao userDao;

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

    public void execute(){
        userDao.findUser();
    }
}
public class UserDao {
    public void findUser(){
        System.out.println("查找用户");
    }
}

        (2) Asigne y configure userService y userDao en bean.xml.

    <!--    外部注入bean-->
    <bean id="userService" class="com.yht.example2.service.UserService">
        <!--  ref 属性:创建的userDao对象的bean标签的id值     -->
        <property name="userDao" ref="userDao"></property>
    </bean>
    <bean id="userDao" class="com.yht.example2.dao.UserDao"></bean>

       (3) Realice pruebas unitarias.

@Test
    public void testOuterBean(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        UserService userService = (UserService) context.getBean("userService");
        userService.execute();
    }

       Los resultados de la ejecución son los siguientes:

 

        Nota: El valor de ref debe ser coherente con el valor de id de la instancia de bean especificada.

2. Frijol interno

       El frijol interno es equivalente a una forma anidada. La diferencia entre este y un bean externo es que el bean interno no necesita escribir una identificación y el exterior no puede acceder a él.

       (1) Cree dos clases de entidad: Emp y Dept.

public class Emp {
    private String empName;
    private Integer age;
    private Dept dept;

    

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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

    @Override
    public String toString() {
        return "Emp{" +
                "empName='" + empName + '\'' +
                ", age=" + age +
                ", dept=" + dept +
                '}';
    }
}
public class Dept {
    private String deptName;

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

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

        (2) Configure el bean interno en bean.xml

    <!--    内部注入bean-->
    <bean id="emp" class="com.yht.example2.entity.Emp">
        <property name="empName" value="王飞"></property>
        <property name="age" value="21"></property>
        <property name="dept">
            <bean id="dept" class="com.yht.example2.entity.Dept">
                <property name="deptName" value="开发部"></property>
            </bean>
        </property>
    </bean>

       (3) Realice pruebas unitarias.

    @Test
    public void testInnerBean(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        Emp emp = (Emp) context.getBean("emp");
        System.out.println(emp);
    }

       Los resultados de la ejecución son los siguientes:

 

3. Frijoles en cascada

       Spring admite la configuración de atributos en cascada. Spring no limita el número de niveles de atributos en cascada. Siempre que el Bean configurado tenga una estructura de clases correspondiente a los atributos en cascada, se puede configurar cualquier nivel de atributos en cascada. Hay dos formas de configurar atributos en cascada: una es la forma de beans externos, la otra es proporcionar el método get del atributo en la clase de entidad y luego completarlo a través del operador. En el archivo de configuración.

       (1) Agregue un método get al atributo dept en la clase Emp.

    public Dept getDept() {
        return dept;
    }

       (2) Configure en bean.xml.

    <!--        级联bean 方式一  -->
    <bean id="employee1" class="com.yht.example2.entity.Emp">
        <property name="empName" value="张帆"></property>
        <property name="age" value="11"></property>
        <property name="dept" ref="dept"></property>
    </bean>
    <bean id="dept" class="com.yht.example2.entity.Dept">
        <property name="deptName" value="开发部"></property>
    </bean>
    <!--    方式二   -->
    <bean id="employee2" class="com.yht.example2.entity.Emp">
        <property name="empName" value="康特"></property>
        <property name="age" value="32"></property>
        <property name="dept" ref="dept"></property>
        <property name="dept.deptName" value="安保部"></property>
    </bean>

       (3) Realice pruebas unitarias.

    @Test
    public void testContactBean(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        Emp emp1 = (Emp) context.getBean("employee1");
        System.out.println(emp1);
        Emp emp2 = (Emp) context.getBean("employee2");
        System.out.println(emp2);
    }

       Los resultados de la ejecución son los siguientes:

Tres, inyección de tipos de datos comunes

1. Inyección de tipos de datos básicos y tipos de recopilación

       Los tipos de datos básicos en Spring incluyen los ocho tipos de datos básicos en Java y el tipo String. Aquí explicamos los métodos de inyección de tipos de datos básicos, Array, list, set y Map, respectivamente.

       (1) Cree la clase ParaTest.

public class ParaTest {
    private String name;
    private String[] strings;
    private List<Integer> lists;
    private Set<Double> sets;
    private Map<Character, String> map;

    public void setName(String name) {
        this.name = name;
    }

    public void setStrings(String[] strings) {
        this.strings = strings;
    }

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

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

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

    public void showMessage(){
        System.out.println("name is : " + this.name);
        System.out.println("Strings content are : " + Arrays.toString(this.strings));
        System.out.println("lists content are  : " + this.lists);
        System.out.println("sets content are  : " + this.sets);
        System.out.println("map content are  : " + this.map);
    }
}

       (2) Configure objetos en bean.xml e inyecte valores.

    <!--  测试基本数据类型和集合数据类型  -->
    <bean id="para" class="com.yht.example2.entity.ParaTest">
        <!--   注入String     -->
        <property name="name" value="郑秀"></property>
        <!--   注入数组     -->
        <property name="strings">
            <array>
                <value>魏国</value>
                <value>蜀国</value>
                <value>吴国</value>
            </array>
        </property>
        <!--   注入list     -->
        <property name="lists">
            <list>
                <value>13</value>
                <value>35</value>
                <value>57</value>
            </list>
        </property>
        <!--   注入set     -->
        <property name="sets">
            <set>
                <value>12.5</value>
                <value>754.1</value>
                <value>89.0</value>
            </set>
        </property>
        <!--   注入map     -->
        <property name="map">
            <map>
                <entry key="a" value="Apple"></entry>
                <entry key="b" value="bar"></entry>
                <entry key="c" value="car"></entry>
                <entry key="d" value="department"></entry>
            </map>
        </property>
    </bean>

       (3) Realice pruebas unitarias.

    @Test
    public void testPara(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
        ParaTest para = (ParaTest) context.getBean("para");
        para.showMessage();
    }

       Los resultados de la ejecución son los siguientes:

2. Inyección de tipo de objeto

       En circunstancias normales, es más probable que usemos tipos de objetos de inyección. Hay muchos libros para una persona, entonces, ¿cómo lograrlo?

        (1) Agregue List <Book> a la clase Person y proporcione el método set ().

    private List<Book> bookList;

    public void setBookList(List<Book> bookList) {
        this.bookList = bookList;
    }

       (2) Configure en bean.xml.

    <!--  注入对象类型  -->
    <bean id="bookPerson" class="com.yht.example1.entity.Person">
        <property name="name" value="赵峰"></property>
        <property name="age" value="45"></property>
        <property name="bookList">
            <list>
                <ref bean="b1"></ref>
                <ref bean="b2"></ref>
            </list>
        </property>
    </bean>
    <bean id="b1" class="com.yht.example1.entity.Book">
        <constructor-arg name="bName" value="三国演义"></constructor-arg>
        <constructor-arg name="bAuthor" value="罗贯中"></constructor-arg>
    </bean>
    <bean id="b2" class="com.yht.example1.entity.Book">
        <constructor-arg name="bName" value="水浒传"></constructor-arg>
        <constructor-arg name="bAuthor" value="施耐庵"></constructor-arg>
    </bean>

       (3) Realice pruebas unitarias.

    @Test
    public void testObjectPara(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
        Person person= (Person) context.getBean("bookPerson");
        System.out.println(person);
    }

       Los resultados son los siguientes:

 3. Extrae la parte pública

       Ahora suponga que hay muchas personas cuyos libros son iguales, y los libros deben extraerse como parte pública. Proceder de la siguiente:

       (1) Introduzca la utilidad de espacio de nombres en el archivo de configuración de 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"
       xmlns:util="http://www.springframework.org/schema/util"
       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">

       (2) Utilice la etiqueta util para completar la inyección y extracción de la colección de listas.

<?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:util="http://www.springframework.org/schema/util"
       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">
    <bean id="b1" class="com.yht.example1.entity.Book">
        <constructor-arg name="bName" value="三国演义"></constructor-arg>
        <constructor-arg name="bAuthor" value="罗贯中"></constructor-arg>
    </bean>
    <bean id="b2" class="com.yht.example1.entity.Book">
        <constructor-arg name="bName" value="水浒传"></constructor-arg>
        <constructor-arg name="bAuthor" value="施耐庵"></constructor-arg>
    </bean>
    <!--把集合注入部分提取出来-->
    <!-- 提取list集合类型属性注入-->
    <util:list id="bookList">
        <ref bean="b1"></ref>
        <ref bean="b2"></ref>
    </util:list>

    <!-- 提取list集合类型属性注入使用-->
    <bean id="person1" class="com.yht.example1.entity.Person" scope="prototype">
        <property name="name" value="王刚"></property>
        <property name="age" value="40"></property>
        <property name="bookList" ref="bookList"></property>
    </bean>
    <bean id="person2" class="com.yht.example1.entity.Person" scope="prototype">
        <property name="name" value="张凡"></property>
        <property name="age" value="32"></property>
        <property name="bookList" ref="bookList"></property>
    </bean>
</beans>

       (3) Realice pruebas unitarias.

    @Test
    public void testCommonContent(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
        Person person1 = (Person) context.getBean("person1");
        System.out.println(person1);
        Person person2 = (Person) context.getBean("person2");
        System.out.println(person2);
    }

       Los resultados de la ejecución son los siguientes:

Supongo que te gusta

Origin blog.csdn.net/weixin_47382783/article/details/112757551
Recomendado
Clasificación