Spring小指南(Spring笔记整理-上)

Posted Huterox

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring小指南(Spring笔记整理-上)相关的知识,希望对你有一定的参考价值。

文章目录

前言

怎么说呢,最近有计划需要把以前的老东西给做一个大的规整。不能那啥忘了,大动作目前是没有什么太大打算的,有也没空。而且也发现最近有个Java 这部分的内容还是挺受欢迎的。而且前段时间也是拜读了一下谭永强老师的书,收获也是颇大,只不过后面由于比赛,和人工智能部分的学习耽误了。

那么今天也是对Spring做一个小小的总结,总理,一方面加深自己的学习,一方面是做一个小结,总结一些误区啥的。

Spring 环境搭建

Spring理解

先来说说,我对于 Spring的理解吧,一开始我学的时候也是一听什么AOP IOC 觉得很牛逼什么的,或者说这玩意感觉好像是没什么厉害之处,没有什么实际的必要。但是到后来,接触了那么久,才突然发现这玩意原来还是很重要的,理解起来其实也不难。对于Spring这个玩意我觉得我们实际上可以理解为一个python 的模块,这个玩意可以很方便地去帮助我们管理对象 。去在不对人家的源代码修改的情况下,去增加一些功能。换一句话说,我可以在一个“灰盒”的情况下对一个项目进行管理和修改。
而后面的SpringMVC 又是什么玩意咧,这个说实话还是要从Serlvet说起,人家使用了一套类似于处理中心的概念,然后利用Spring 提供的IOC与AOP轻松实现了我们的对于web层的控制。而Mybatis它只是另外一个组件,就像jdbc一样,我们可以非常轻松地使用mybatis,只不过我们习惯把mybatis和Spring整合起来,于是著名的Spring SpringMVC Mybatis 体系出来了。不过没猜错那是我读初中的时候的流行体系吧,后面16 17 年SpringBoot应该是出来了,现在的体系王牌可以总结为SSM :springCloud SpringBoot Mybatis/plus(还是有人用mybatis其实我是不理解的,plus显然要更好用)现在已经是微服务体系了,而微服务和SpringBoot又是紧密相连,当然我们直接使用Spring整合是可以的,boot理论上可以理解为Springplus。

这里我想再说明的是:Spring框架本身其实是有大概三个东西的一个是IOC,AOP这些东西,这个是我们常说的SSM 的第一个S,第二个是MVC这个其实也是属于这个大框架下的也就是第二个S,还有一个是对Dao层的支持,不过这里一般是使用Mybatis

环境搭建

由于只是一个对Spring的介绍,重点在于Spring的IOC配置和AOP操作,所以这里只需要搭建一个最简单的Maven工程即可。由于演示需要,这里还需要引入别的依赖。

<?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>org.example</groupId>
    <artifactId>SpringReview</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>


    <dependencies>
<!--        spring ioc 依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.13.RELEASE</version>
        </dependency>
<!--junit测试单元-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

<!--数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.9</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

    </dependencies>

</project>

IOC 部分

我们这边分两个部分。一个是XML部分,然后一个是注解部分,然后都是属于IOC部分的。既然是传说当中的小指南,所以这里我会仔细地说一下,最起码把我本人的习惯操作都给出来。

XML 部分

普通类注入

我们这边先定义这两个玩意

接下来都是基于这两个类进行演示的哈。
这里面接下来会涉及,依赖注入的大部分内容。

我们先仔细查看这两个类哈。

package com.huterox.pojo.Imp;

import com.huterox.pojo.FuckDao;
import com.huterox.pojo.UserDao;

import java.util.HashMap;
import java.util.List;

public class FuckDaoImp implements FuckDao 

    List<String> names;
    HashMap<String, UserDao> users;
    String fuck;
    double height;
    int age;

    public FuckDaoImp(String fuck, double height) 
        this.fuck = fuck;
        this.height = height;
    

    @Override
    public void fuck() 
        System.out.println("No more Love Get the fuck out of here");
    



package com.huterox.pojo.Imp;

import com.huterox.pojo.UserDao;

public class UserDaoImp implements UserDao 
    @Override
    public void say() 
        System.out.println("Just Test for Spring");
    


我们先来把最简单的那个玩意注入到咱们的容器当中。
为此我们先创建一个文件

我们先直接注入第一个

接下来是咱们的第二个。


    <bean id="fuckDao" class="com.huterox.pojo.Imp.FuckDaoImp">

        <constructor-arg index="0" value="小米"/>
        <constructor-arg index="1" value="19.2"/>
        <property name="age" value="5"/>
        <property name="names">
            <list>
                <value>小米</value>
                <value>小明</value>
            </list>
        </property>

        <property name="users">
            <map>
                <entry key="f" value-ref="userDao"/>
            </map>
        </property>
    </bean>

此时我们已经把这玩意给注入进去了。

不过此时显然还不够。为什么我们还没有引入进去主配置文件。一般情况下为了隔离,我们一般是会分开来的。

加载

public class Application 
    public static void main(String[] args) throws SQLException 
        ApplicationContext app = new ClassPathXmlApplicationContext("Application.xml");
        FuckDao fuckDao = (FuckDao) app.getBean("fuckDao");
        fuckDao.fuck();
    


配置类注入

现在咱们拿原来的例子,配置Druid

我们先把参数提取出来,放在配置文件properties

然后咱们去创建一个专门配置Druid的xml配置文件
这里需要注意的是我们需要映入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="classpath:Druid.properties"/>
    <bean id="dataSource" class="$dataSource">
        <property name="DriverClassName" value="$DriverClassName"/>
        <property name="Url" value="$Url"/>
        <property name="Username" value="$Username"/>
        <property name="Password" value="$Password"/>
    </bean>
</beans>

然后咱们再次放到这个主要的配置文件里面去

public class Application 
    public static void main(String[] args) throws SQLException 
        ApplicationContext app = new ClassPathXmlApplicationContext("Application.xml");
        DataSource dataSource = app.getBean(DataSource.class);
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    


到此我们已经完成了XML IOC 部分的操作。

小结一下

Map注入

  <property name="map">
            <map>
                <entry key="Hello" value="world"/>
            </map>
        </property>
        

数组注入

<property name="strings">
            <array>
                <value>Hello</value>
                <value>world</value>
            </array>
        </property>

列表注入

 <property name="list">
            <list>
                <value>Hello</value>
                <value>World</value>
            </list>
        </property>

集合注入

  <property name="set">
            <set>
                <value>Hello</value>
                <value>world</value>
            </set>
        </property>

Properties注入

 <property name="properties">
            <props>
                <prop key="Hello">world</prop>
            </props>
        </property>

引入包扫描

    <context:component-scan base-package="你的包"/>

这个是配合注解使用的。

Bean 的作用域

单例模式(默认的)

xml <bean id="Hello" class="com.huterox.pojo.Hello" scope="singleton">

原型模式

注解部分

接下来进入到咱们的注解部分了,我们对我们的这个进行一定优化一下。

Component

我们先说一下,下面三个功能一样只是为了三层架构做了区分!
Dao 层----> @Repository
Service ----> @Service
controller ----> @Controller

有什么用,看下面的操作

到这里就起到了一个代替的作用。

那么接下来我们开始修改那个比较复杂的类了。

Value

这个是普通的玩意注入

Autowired

这个是复杂类型的,包括咱们这个list,map 但是咱们这个比较特殊,先直接说结论吧,今天准备的两个例子,不太能够体现复杂类型的注入。

对于list、set填入的是注入类型Spring管理的实例,对于map,Spring会将service的名字作为key,对象作为value封装进入Map。

不过,我想说的是这个注解常用,不过是通过类型注入。
此外还有一个常考的:

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按
byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  @Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

Qualifier

一般情况下,如果你想byName你可以这样
@Qualifier(“userDao”)

Scope注解

这个就是那个作用域嘛

@Component
@Scope("prototype")
//@Scope("singleton")
public class User
	@Value("Huterox")
	public String name;

配置部分注解

这个是咱们SpringBoot里面常用的,其实也是在Spring衍生过来的。
我们还是以这个配置Druid为例子吧。

我们现在的目标是代替两个玩意,一个是 主要的xml配置文件,一个是所有的xml文件。

现在我们就剩下两个没有代替了,一个是主配置,一个是德鲁伊的。

创建配置类

package com.huterox.Config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(DuridConfig.class)
@ComponentScan("com.huterox")
public class Config 


package com.huterox.Config;


import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:Druid.properties")
public class DuridConfig 

    @Value("$DriverClassName")
    String DriverClassName;
    @Value("$Url")
    String Url;
    @Value("$Username")
    String Username;
    @Value("$Password")
    String Password;

    @Bean
    public DruidDataSource getDataSource()
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(DriverClassName);
        dataSource.setUrl(Url);
        dataSource.setUsername(Username);
        dataSource.setPassword(Password);
        return dataSource;

    


使用注解上下文

接下来替换所有的xml,这里咱们直接使用这个

效果

IOC部分原理实现

这个也是以前写的,不过反响不大,说实话,我不理解为什么我觉得写的不错的文章压根没什么人看(虽然我写博文的目的也是为了记录,但是我不理解,看官方文档就能学会的东西,营销号性质的玩意怎么那么多人看,好不容易分享点干货(自认为的干货)没人看,不理解,不理解)

Spring之手写SpringMVC5个注解(之IOC,DI优化)了解三级缓存

以上是关于Spring小指南(Spring笔记整理-上)的主要内容,如果未能解决你的问题,请参考以下文章

泉州买房小指南

KubeEdgeKubeEdge部署小指南-Edge节点接入(避坑)

微信“小程序”开发小指南

泉州程序员置业小指南

业内“大师级Dubbo实战笔记”面世,附学习笔记+面试整理+进阶书籍

阿里架构师吐血整理:从源码到架构的Spring全系列笔记,已全部分享