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节点接入(避坑)