05P/C命名空间注入(简化set/构造方法注入)//两种自动装配//Spring引入外部配置文件

2024-01-08 19:48:19

P命名空间注入

p命名空间注入本质还是set注入,是对set注入的简化,但在类中一样要提供set方法,只不过其让Spring配置的xml更简单.

<bean id="customerBean" class="com.powernode.spring6.beans.Customer" p:name="zhangsan" p:age="20"/>
        对比常规set注入的xml:
    <bean id="customerBean" class="com.powernode.spring6.beans.Customer">
        <property name="name" value="zhangsan"/>
        <property name="age" value="20"/>
    </bean>

但是使用前要先在XML头部信息中添加p命名空间的配置信息:

xmlns:p="http://www.springframework.org/schema/p"
-->

C命名空间注入

C命名空间注入本质还是构造方法注入,是对构造方法注入的简化,但在类中一样要提供构造方法,只不过其让Spring配置的xml更简单.

<bean id="myTimeBean" class="com.powernode.spring6.beans.MyTime" c:_0="2008" c:_1="8" c:_2="8"/><bean id="myTimeBean" class="com.powernode.spring6.beans.MyTime" c:year="1970" c:month="1" c:day="1"/>
 对比常规构造方法注入的xml:
<bean id="myTimeBean" class = "com.powernode.spring6.beans.MyTime">
 <!--        构造注入的标签的第一种方法
index属性指定参数下标,序号从0开始,对应着CustomerService的构造方法中的两个先后对象
ref属性指定要注入的bean的id-->
<!--        <constructor-arg index = "0" ref="userDaoBean"/>-->
<!--        <constructor-arg index = "1" ref="vipDaoBean"/>-->
        <!--        构造注入的标签的第二种方法
index属性指定参数下标,序号从0开始,对应着CustomerService的构造方法中的两个先后参数(即对象名)-->
                <constructor-arg name = "year" value="2008"/>
                <constructor-arg name = "month" value="8"/>
                <constructor-arg name = "day" value="8"/>

基于XML的自动装配(注入)

Spring还可以完成自动化的注入,自动化注入又被称为自动装配。它可以根据名字进行自动装配,也可以根据类型进行自动装配。

根据名称自动装配

根据名称装配(byName),底层会调用set方法进行注入。
例如:setAge() 对应的名字是age,setPassword()对应的名字是password,setEmail()对应的名字是email。

持久层一个UserDao类,类中一个insert方法;控制层一个UserService类,在该类中有一个userDao对象, 用这个对象调用UserDao类中的insert方法.

package com.powernode.spring6.dao;

public class UserDao {

    public void insert(){
        System.out.println("正在保存用户数据。");
    }
}
package com.powernode.spring6.service;

import com.powernode.spring6.dao.UserDao;

public class UserService {

    private UserDao userDao;

    // 方法名意为 set userDao,但由于强制采用驼峰命名,因此变为setUserDao,注意.事实上也不可能set UserDao,UserDao是一个类.并非一个对象实例.
    public void setUserDao(UserDao aaa) {
        this.userDao = aaa;
    }

    public void save(){
        userDao.insert();
    }
}
<?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">
<!--   autowire="byName",表示通过名称进行装配。
	   UserService类中有一个UserDao属性,而UserDao属性的名字是aaa,对应的set方法是setAaa(),正好和UserDao Bean的id是一样的。这就是根据名称自动装配。
	   在	UserService层进行userDao的自动装配,因此autowire属性写在第一条中.-->
    <bean id="userService" class="com.powernode.spring6.service.UserService" autowire="byName"/>
    <!--userDao关联到setUserDao对象-->
    <bean id="userDao" class="com.powernode.spring6.dao.UserDao"/>

</beans>

根据类型自动装配

根据类型装配(byType),底层依然是调用set方法进行注入。
与根据名称装配不同的是,根据类型装配时,spring的配置文件中不能装配两个相同类型的bean,因为毕竟是根据类型装配,如果类型都相同,系统无法辨认

    <bean id="accountService" class="com.powernode.spring6.service.AccountService" autowire="byType"/>
<!--x和y都是AccountDao类型的bean,都需要在AccountService中完成装配,因此此时系统报错,无法根据类型装配-->
    <bean id="x" class="com.powernode.spring6.dao.AccountDao"/>
    <bean id="y" class="com.powernode.spring6.dao.AccountDao"/>
Spring引入外部配置文件

引入的目的?
编写数据源的时候是需要连接数据库的信息的,例如:driver url username password等信息。这些信息如果单独写到一个属性配置文件中,用户修改起来会更加的方便。

第一步:写一个数据源类,提供相关属性。

package com.powernode.spring6.beans;

import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;

public class MyDataSource implements DataSource {
    @Override
    public String toString() {
        return "MyDataSource{" +
                "driver='" + driver + '\'' +
                ", url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    private String driver;
    private String url;
    private String username;
    private String password;

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    //......
}

第二步:在类路径下新建jdbc.properties文件,并配置信息。

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/spring
username=root
password=root123

第三步:在spring配置文件中引入context命名空间。

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
              <!--新增-->
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
                           
 <!--新增,引入创建的外部配置文件-->
    <context:property-placeholder location="jdbc.properties"/>
    
     <!--美元符号取出-->
    <bean id="dataSource" class="com.powernode.spring6.beans.MyDataSource">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </bean>
</beans>

文章来源:https://blog.csdn.net/m0_46671240/article/details/135410317
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。