Spring6 (1)

news2024/11/17 8:19:16

Spring

  • 1、简介:
  • 2、第一个程序
  • 2、set注入
    • 2.1 简单数据类型
    • 2.2测试
    • 2.3 注入Properties
    • 2.4 p命名空间注入
    • 2.5 c命名空间注入
    • 2.6 util注入
    • 2.6 引入外部配置文件

1、简介:

自己的理解:spring其实就是一个容器,也可以说是一个框架,主要是控制反转和面向切面编程。
控制反转IOC:是一种思想,就是把new对象的权力交给了spring,也把两个对象之间关系的连接交给了别人。
依赖注入DI:是控制反转的一种实现方式,依赖就是指对象A和对象B之间的关系,注入就是就是一种方式将对象A和对象B关联起来。
依赖注入DI,又包括常见的两种方式:
第一种:set注入(执行set方法给属性赋值)
第二种:构造方法注入(执行构造方法给属性赋值)

注意术语:
OCP:开闭原则(开发原则)
DIP:依赖倒置原则(开发原则)
IoC:控制反转(一种思想,一种新型的设计模式)
DI:依赖注入(控制反转思想的具体实现方式)

2、第一个程序

首先建立一个空项目
在这里插入图片描述
给该项目添加上jdk配置,即给该项目下的所有模块都进行了配置。
在这里插入图片描述
在这里插入图片描述

接着创建一个module模块
在这里插入图片描述
创建一个maven模块
在这里插入图片描述
在resoureces目录下配置spring xml文件配置,即在这里边进行依赖注入。
配置pom.xml(根据自己的需求)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cky</groupId>
    <artifactId>spring6-demo1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.1.5</version>
        </dependency>
        <!--log4j2的依赖-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.19.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j2-impl</artifactId>
            <version>2.19.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>


</project>

我的项目目录:
在这里插入图片描述
我的spring6.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">
    <bean id="user" class="com.cky.Bean.User"></bean>
    <bean id="userDaoimpl" class="com.cky.dao.impl.UserDaoimpl"></bean>
    <bean id="userServiceimpl" class="com.cky.service.impl.UserServiceimpl">
        <property name="userDao" ref="userDaoimpl"></property>
    </bean>
    <bean id="userweb" class="com.cky.web.Userweb">
        <property name="userService" ref="userServiceimpl"></property>
    </bean>
</beans>

set注入
name是set方法后边的字母(第一个字母小写),ref是要注入bean的id。
set注入是先实例化对象,在注入

构造注入
通过测试得知,通过构造方法注入的时候:
● 可以通过下标 index
● 可以通过参数名 name
● 也可以不指定下标和参数名,可以类型自动推断。
Spring在装配方面做的还是比较健壮的。
构造注入是实例化对象的同时就进行了依赖注入。

2、set注入

2.1 简单数据类型

public static boolean isSimpleValueType(Class<?> type) {
		return (Void.class != type && void.class != type &&
				(ClassUtils.isPrimitiveOrWrapper(type) ||
				Enum.class.isAssignableFrom(type) ||
				CharSequence.class.isAssignableFrom(type) ||
				Number.class.isAssignableFrom(type) ||
				Date.class.isAssignableFrom(type) ||
				Temporal.class.isAssignableFrom(type) ||
				URI.class == type ||
				URL.class == type ||
				Locale.class == type ||
				Class.class == type));
	}

通过源码分析得知,简单类型包括:
● 基本数据类型
● 基本数据类型对应的包装类
● String或其他的CharSequence子类
● Number子类
● Date子类
● Enum子类
● URI
● URL
● Temporal子类
● Locale
● Class
● 另外还包括以上简单值类型对应的数组类型。

2.2测试

package com.cky.Bean;

public class People {
    private String name;

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

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

package com.cky.Bean;

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

public class User {
    private  Class aClass;
    private String[] names;
    private List<People> peoples;
    private Map<Integer,String> maps;
    private Set<String> sets;
    private String nulls;
    private String email;
    private String p;

    public void setP(String p) {
        this.p = p;
    }

    @Override
    public String toString() {
        return "User{" +
                "aClass=" + aClass +
                ", names=" + Arrays.toString(names) +
                ", peoples=" + peoples +
                ", maps=" + maps +
                ", sets=" + sets +
                ", nulls='" + nulls + '\'' +
                ", email='" + email + '\'' +
                ", p='" + p + '\'' +
                '}';
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setNames(String[] names) {
        this.names = names;
    }

    public void setPeoples(List<People> peoples) {
        this.peoples = peoples;
    }

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

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

    public void setNulls(String nulls) {
        this.nulls = nulls;
    }

    public void setaClass(Class aClass) {
        this.aClass = aClass;
    }

    public User(){
        System.out.println("无参构造执行了");
    }

}

<?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">
<!--    private  Class aClass;
    private String[] names;
    private List<People> peoples;
    private Map<Integer,String> maps;
    private Set<String> sets;
    private String nulls;
        private String email;-->
    <bean name="people1" class="com.cky.Bean.People">
        <property name="name" value="cui"></property>
    </bean>
    <bean name="people2" class="com.cky.Bean.People">
        <property name="name" value="cky"></property>
    </bean>
    <bean name="user" class="com.cky.Bean.User">
<!--     类   -->
        <property name="aClass" value="java.lang.String"></property>
<!--        数组-->
        <property name="names">
            <array>
                <value>a</value>
                <value>b</value>
            </array>
        </property>
<!--        list -->
        <property name="peoples">
            <list>
                <ref bean="people1"></ref>
                <ref bean="people2"></ref>
            </list>
        </property>
<!--        map-->
        <property name="maps">
            <map>
                <entry key="1" value="vui"></entry>
                <entry key="2" value="vui"></entry>
            </map>
        </property>
<!--        set-->
        <property name="sets">
            <set>
                <value>ni</value>
                <value>hao</value>
            </set>
        </property>
<!--        空第一种形式-->
<!--        <property name="nulls" value=""/>-->
<!--        第二种形式-->
        <property name="nulls">
        <value/>
        </property>
<!--        null-->
        <property name="email"><null/></property>
<!--        或者只是不赋值 也为null-->
        <property name="p">
<!--            特殊字符-->
            <value><![CDATA[2 < 3]]></value>
        </property>

    </bean>
</beans>
package com.cky.test;

import com.cky.Bean.User;
import com.cky.web.Userweb;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Mytest {
    @Test
    public void test(){
        //获取spring容器
        ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring6_1.xml");
        //获取对应的bean
        User userweb = applicationContext.getBean("user", User.class);
        System.out.println(userweb);

    }
}

User{aClass=class java.lang.String, names=[a, b], peoples=[People{name=‘cui’}, People{name=‘cky’}], maps={1=vui, 2=vui}, sets=[ni, hao], nulls=‘’, email=‘null’, p=‘2 < 3’}
在这里插入图片描述

2.3 注入Properties

package com.powernode.spring6.beans;

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

/**
 * @author 动力节点
 * @version 1.0
 * @className People
 * @since 1.0
 **/
public class People {

    private Properties properties;

    public void setProperties(Properties properties) {
        this.properties = properties;
    }
    
    //......

    @Override
    public String toString() {
        return "People{" +
                "properties=" + properties +
                ", addrs=" + addrs +
                ", phones=" + phones +
                ", names=" + names +
                '}';
    }
}

<?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="peopleBean" class="com.powernode.spring6.beans.People">
        <property name="properties">
            <props>
                <prop key="driver">com.mysql.cj.jdbc.Driver</prop>
                <prop key="url">jdbc:mysql://localhost:3306/spring</prop>
                <prop key="username">root</prop>
                <prop key="password">123456</prop>
            </props>
        </property>
    </bean>
</beans>

2.4 p命名空间注入

本质是set注入,需要提供set方法。

<?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="peo" class="com.cky.Bean.People" p:name="cui"></bean>
</beans>

2.5 c命名空间注入

本质是构造注入,需要提供构造方法。

<?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:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    <bean name="cat" class="com.cky.Bean.Cat" c:_0="k" c:_1="2"></bean>-->
<!--    或者-->
    <bean id="cat" class="com.cky.Bean.Cat" c:name="3" c:age="2"></bean>
    

</beans>

2.6 util注入

可以使得内容共享。

<?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">
    <util:properties id="dogbean">
        <prop key="name">k</prop>
        <prop key="age">2</prop>
        <prop key="sex"></prop>
    </util:properties>
    <bean name="dog1" class="com.cky.Bean.Dog">
        <property name="properties" ref="dogbean"></property>
    </bean>
    <bean name="dog2" class="com.cky.Bean.Dog">
        <property name="properties" ref="dogbean"></property>
    </bean>

</beans>

2.6 引入外部配置文件

比如数据源的driver,password,url等配置,我们想要配置到一个jdbc.properties
文件中,然后通过读取该配置文件的值,为我们的类赋值。
DataSource .java

package com.cky.Bean;

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

public class DataSource implements javax.sql.DataSource {
    private String url;
    private String driver;
    private String password;
    private String username;

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

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

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

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

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

    @Override
    public Connection getConnection() throws SQLException {
        return null;
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        return null;
    }

    @Override
    public PrintWriter getLogWriter() throws SQLException {
        return null;
    }

    @Override
    public void setLogWriter(PrintWriter out) throws SQLException {

    }

    @Override
    public void setLoginTimeout(int seconds) throws SQLException {

    }

    @Override
    public int getLoginTimeout() throws SQLException {
        return 0;
    }

    @Override
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        return null;
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return false;
    }
}

jdbc.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql//127.0.0.1:3306/spring
username=root
passwoed=123456

spring_pro.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: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"></context:property-placeholder>
    <bean id="datasource" class="com.cky.Bean.DataSource">
        <property name="driver" value="${driver}"></property>
        <property name="url" value="${url}"></property>
        <property name="password" value="${passwoed}"></property>
        <property name="username" value="${username}"></property>
    </bean>

</beans>

测试类

   @Test
    public void test4(){
        //获取spring容器
        ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring_pro.xml");
        DataSource datasource = applicationContext.getBean("datasource", DataSource.class);

        System.out.println(datasource);}

    }

DataSource{url=‘jdbc:mysql//127.0.0.1:3306/spring’, driver=‘com.mysql.cj.jdbc.Driver’, password=‘123456’, username=‘10945’}
注意,这里我们读取到的username是系统的名称,使用 ${} 会让我们先获取到的是 系统变量,所以最好加上前缀。

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql//127.0.0.1:3306/spring
jdbc.username=root
jdbc.passwoed=123456

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1548541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云轻量4核8G12M服务器配置4C8G12M详解

4核8G是云服务器的参数&#xff0c;代表云服务器的硬件配置和网络带宽&#xff0c;4核代表CPU、8G是指内存、12M代表带宽值为12Mbps&#xff0c;腾讯云百科txybk.com以腾讯云轻量应用服务器4核8G12M带宽配置为例&#xff0c;来详细介绍下服务器参数&#xff1a; 4c8g是什么意思…

高阶数据结构 <红黑树>

本文已收录至《数据结构(C/C语言)》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言正文红黑树简介红黑树整体结构红黑树节点的定义红黑树主体类设计红黑树的插入函数情况一&#xff1a;变色情况二&#xff1a;变色旋转单旋情况双旋情况 完整插入代码 关于红黑树红黑树检…

鸿蒙OS实例:同步获取应用配置的【versionCode和versionName】

1.同步方式获取 首先需要导包&#xff1a; import bundleManager from ohos.bundle.bundleManager 工具类&#xff1a; public static async getVersionName(): Promise<string> {try {let bundleInfo await bundleManager.getBundleInfoForSelf(bundleManager.Bundle…

树状数组及应用

目录 1.树状数组的概念与基本编码 1.1.引导 1.2.lowbit(x) 1.3.树状数组的编码 2.树状数组的基本应用 2.1.单点修改&#xff0b;区间查询 2.2.区间修改单点查询 例题&#xff1a; 2.3.区间修改&#xff0b;区间查询 例题&#xff1a; 如果数列A是静态不变的&#xff…

并发学习25--多线程 ThreadPoolExecutor

类图&#xff1a;定义了一些重要的接口和实现类 线程池的几种状态&#xff1a; ThreadPoolExecutor构造方法 1.救急线程 线程池中会有核心线程和救急线程&#xff1b;救急线程数最大线程数-核心线程数。而救急线程会在阻塞队列已经占满的情况下&#xff0c;执行下一个即将要被…

RK3568-开启ptp服务

硬件支持 mac或者phy需要支持ptp驱动支持 CONFIG_PTP_1588_CLOCK=y虚拟机端:虚拟机只支持软件时间戳。 安装ptp服务:sudo apt-get install linuxptp 修改ptp服务:sudo vi /lib/systemd/system/ptp4l.service,修改为ens33网口,-S表示使用软件时间戳。forlinx@ubuntu:~$ s…

Redis修改开源协议,6大备胎重见天日

背景&#xff1a;Redis2018年以来修改了多次开源协议&#xff0c;以前是把一些高级功能收费&#xff0c;这次彻底怒了&#xff0c;把核心代码的协议修改为RSALv2和SSPL双重协议&#xff0c;这个修改对普通用户不受影响&#xff0c;是向所有云厂商开炮&#xff0c;以后云厂商将不…

迁移android studio 模拟器位置

android studio 初始位置是安装在c盘&#xff0c;若是要迁移需 1创建一个目标位置如我的F:/avd 2在系统环境变量里面设置新的地址 变量名&#xff1a;ANDROID_SDK_HOME 变量值&#xff1a;F:/avd 3最重要的是文件复制&#xff0c;将C盘里面avd的上层目录.android的目录整体…

C++ static静态变量详解

目录 觉得有用就给博主点个赞吧&#xff01;谢谢啦&#xff01;嘻嘻嘻 概念&#xff1a; 特性 如何计算一个类创建了多少个对象&#xff1f; 概念&#xff1a; 用static关键字修饰的成员变量叫做静态成员变量 在类内部&#xff0c;但是属于全局&#xff0c;不属于任意一个…

前端调用接口地址跨越问题,nginx配置处理

在nginx配置里面添加add_header如下&#xff1a; add_header Access-Control-Allow-Origin *; #add_header Access-Control-Allow-Origin http://localhost:8080 always; add_header Access-Control-Allow-Methods GET, POST, PUT, D…

JavaScript Uncaught ReferenceError: WScript is not defined

项目场景&#xff1a; 最近在Visual Studio 2019上编译libmodbus库&#xff0c;出现了很多问题&#xff0c;一一解决特此记录下来。 问题描述 首先就是configure.js文件的问题&#xff0c;它会生成两个很重要的头文件modbus_version.h和config.h&#xff0c;这两个头文件其中…

【Lazy ORM 框架学习】

Gitee 点赞关注不迷路 项目地址 快速入门 模块所属层级描述快照版本正式版本wu-database-lazy-lambdalambda针对不同数据源wu-database-lazy-orm-coreorm 核心orm核心处理wu-database-lazy-sqlsql核心处理成处理sql解析、sql执行、sql映射wu-elasticsearch-starterESESwu-hb…

【React】vite + react 项目,进行配置 eslint

安装与配置 eslint 1 安装 eslint @babel/eslint-parser2 初始化配置 eslint3 安装 vite-plugin-eslint4 配置 vite.config.js 文件5 修改 eslint 默认配置1 安装 eslint @babel/eslint-parser npm i -D eslint @babel/eslint-parser2 初始化配置 eslint npx eslint --init相…

Vmware虚拟机无法用root直连说明

Vmware虚拟机无法用root直连说明 背景目的SSH服务介绍无法连接检查配置 背景 今天在VM上新装了一套Centos-stream-9系统&#xff0c;网络适配器的连接方式采用的是桥接&#xff0c;安装好虚拟机后&#xff0c;在本地用ssh工具进行远程连接&#xff0c;ip、用户、密码均是成功的…

【正点原子FreeRTOS学习笔记】————(12)信号量

这里写目录标题 一、信号量的简介&#xff08;了解&#xff09;二、二值信号量&#xff08;熟悉&#xff09;三、二值信号量实验&#xff08;掌握&#xff09;四、计数型信号量&#xff08;熟悉&#xff09;五、计数型信号量实验&#xff08;掌握&#xff09;六、优先级翻转简介…

LInux|命令行参数|环境变量

LInux|命令行参数|环境变量 命令行参数main的参数之argc&#xff0c;argv几个小知识<font color#0099ff size 5 face"黑体">1.子进程默认能看到并访问父进程的数据<font color#4b0082 size 5 face"黑体">2.命令行创建的程序父进程都是bash 环…

iterm2下使用tmux如果左右分屏用鼠标选中文字跨越pane的问题

原来的样子 如图所示&#xff0c;我开了左右分屏的tmux&#xff0c;如果我指向选择右边的三行div&#xff0c;用鼠标选中之后&#xff0c;会发现把左边的内容也框选了。 解决办法 Edit -》 Selection Respects Soft Boundaries 勾选这个功能&#xff08;选择遵循软边界&#…

秒杀VLOOKUP函数,查找数字我只服SUMIF函数

一提到数据查询&#xff0c;相信很多人的第一反应就是使用Vlookup函数。但是今天我想跟大家分享另一种比较另类的数据查询方式&#xff0c;就是利用SUMIF函数&#xff0c;相较于Vlookup函数它更加的简单灵活、且不容易出错&#xff0c;下面我们就来学习下它的使用方法。 1、常…

win10开启了hyper-v,docker 启动还是报错 docker desktop windows hypervisor is not present

问题 在安装了docker windows版本后启动 docker报错docker desktop windows hypervisor is not present 解决措施 首先确认windows功能是否打开Hyper-v 勾选后重启&#xff0c;再次启动 启动后仍报这个错误&#xff0c;是Hyper-v没有设置成功 使用cmd禁用再启用 一.禁用h…

rust中常用cfg属性和cfg!宏的使用说明,实现不同系统的条件编译

cfg有两种使用方式&#xff0c;一种是属性&#xff1a; #[cfg()]&#xff0c;一种是宏&#xff1a;cfg! &#xff0c;这两个都是非常常用的功能。 #[cfg()]是 Rust 中的一个属性 用于根据配置条件来选择性地包含或排除代码。cfg 是 "configuration" 的缩写&#xf…