Spring开发笔记【CodeLinghu】
文章目录
- Spring开发笔记【CodeLinghu】
 - 00、spring框架绪论
 - 01、spring环境搭建
 
- 1.01spring依赖的导入
 - 1.02生成spring框架的配置文件
 - 1.03spring框架如何管理组件对象的创建
 - 1.04启动工厂并在工厂中启动组件对象
 
- 02、IOC和DI核心思想
 
- 2.1、IOC 控制反转 核心思想定义
 - 2.2、面试小概念:
 
- 03、set注入的语法
 - 04、构造注入(用的不多,只做了解)
 - 05、自动注入(用的也不多)
 - 06、spring工厂的细节
 - 07、AOP面向切面编程
 
- 7.1、静态代理(proxy)
 - 7.2、动态代理
 - 7.3、面向切面编程AOP原理概念
 - 7.4、AOP编程的编程步骤
 
- 7.4.1引入AOP编程相关的依赖
 - 7.4.2开发项目额外功能通知
 - 7.4.3配置切面spring.xml
 
- 7.5、aop编程之环绕通知
 - 7.6、切入点表达式
 
- 08、IOC和AOP的复习
 - 09、spring创建复杂对象
 - 10、spring整合mybatis思路分析
 
- 10.1、引入依赖
 - **整合spring和mybatis新方法**:
 - 10.2、spring整合mybatis编程步骤
 
- 10.2.1引入依赖
 - 10.2.2配置spring.xml
 - 10.2.3从工厂中获取SqlSessionFactory对象
 
- 11、spring整合mybatis DAO层的编程开发
 - 12、spring注解式开发
 - 13、ssm整合注解式开发
 - 14、log4j的使用
 - 15、事务传播属性【面试会用】
 - 15、事务传播属性【面试会用】
 
00、spring框架绪论
曾经做开发的时候,我们用的框架比如 Struts2 Mybatis开发一个应用,用的非常单一,两者没有联系是独立起来的,现在学习 spring框架可以做到 Struts2+ spring+ mybatis中间的桥梁,进行整合联系糅合。我们把这个特点称为 轻量级解决方案。
- **特点:**将项目中的单层框架以最佳方式融合在一起。其实就是上述的。
 - 核心作用:
 

01、spring环境搭建
1.01spring依赖的导入
- 我们不用spring最新版本,因为对jdk要求太高,我们选择spring 4.x版本即可。
 - 进入
maven管理,搜索spring。 
网址:https://mvnrepository.com/search?q=spring


<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
1.02生成spring框架的配置文件
1.03spring框架如何管理组件对象的创建
- 看一下我们传统的对象是通过
new 出来的: 

接下来我们要用bean来管理对象userDao。

<!--
1、bean作用:用来管理组件对象的标签。
2、用来管理组件java类的全类名
3、在工厂中生成组件对象的唯一标识
-->
<bean id="bb" class="day1.UserDaoImpl"/>
1.04启动工厂并在工厂中启动组件对象
package day1;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring {
public static void main(String[] args) {
//启动工厂
ApplicationContext context=new ClassPathXmlApplicationContext("day1/day1.xml");
//获取工厂中的对象,还要进行强制转换一下
UserDao userDao = (UserDao) context.getBean("bb");
//使用对象
userDao.find("小明");
}
}
02、IOC和DI核心思想
2.1、IOC 控制反转 核心思想定义
- IOC全称:invasion of controll翻译反转控制,控制反转。
 
以前做开发我们是手动new对象,我们想在哪个类创建对象就创建对象,主动权在我们手上,spring的核心就是:将我们的这个主动权剥夺了,我们创建对象的权利移交给了spring工厂,创建之前要通过 spring工厂来创建,相当于 权力下放。
- DI全称:dependcy injection翻译为依赖注入
 



2.2、面试小概念:

03、set注入的语法

- 一个依赖注入的实例:
 
项目结构图:

一个接口,一个实现类,一个测试类,xml配置文件。
studentImpl类:
package pojo;
public class StudentImpl {
private String name;// 1、把依赖生成成员变量
public void setName(String name) {// 2、生成一个set方法准备导入依赖
this.name = name;
}
@Override
public String toString() {
return "StudentImpl{" +
"name='" + name + '\'' +
'}';
}
}
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="student" class="pojo.StudentImpl">
<property name="name" value="令狐"/>生成对象,并赋值,就是依赖注入!
</bean>
</beans>
测试类:
package pojo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class StudentTest {
public static void main(String[] args) {
//启动指定的工厂
ApplicationContext Context = new ClassPathXmlApplicationContext("/init/init.xml");
//拿取指定的对象
StudentImpl student = (StudentImpl) Context.getBean("student");
//打印返回
System.out.println(student.toString());
}
}
04、构造注入(用的不多,只做了解)
- 将需要注入的对象声明为成员变量
 
package construct;
public class Car {
private String brand;
private String corp;
private Double price;
private int maxSpeed;
}
- 利用构造函数,我写了两个:
 
package construct;
public class Car {
public Car(String brand, String corp, Double price) {
this.brand = brand;
this.corp = corp;
this.price = price;
}
public Car(String brand, String corp, int maxSpeed) {
this.brand = brand;
this.corp = corp;
this.maxSpeed = maxSpeed;
}
}
- 工厂容器里边配置一下:
 
<?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="car" class="construct.Car">
<constructor-arg value="Audi" type="java.lang.String"/>
<constructor-arg value="luntai" type="java.lang.String"/>
<constructor-arg value="30" type="java.lang.Double"/>
</bean>
<bean id="car1" class="construct.Car">
<constructor-arg value="Audi" type="java.lang.String"/>
<constructor-arg value="luntai" type="java.lang.String"/>
<constructor-arg value="300" type="int"/>
</bean>
</beans>
- 构造注入的测试
 
package construct;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class CarTest {
public static void main(String[] args) {
ApplicationContext Context = new ClassPathXmlApplicationContext("/init/init.xml");
Car car = (Car) Context.getBean("car");
System.out.println(car.toString());
}
}
- 执行:
 

05、自动注入(用的也不多)
package autodi;
public class BookDAOImpl implements BookDAO {
private BookDAO bookDAO;
@Override
public void save() {
System.out.println("BookDAO invoke~~~");
}
}
<?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="bookDAO" class="autodi.BookDAOImpl"/>
<!--
autowrite的作用:用来指定当前组件中依赖的组件的注入方式是什么
注意:类中成员变量与工厂中bean的id一致则自动赋值,否则不注入
byname:根据类中的成员变量名进行注入
bytype:根据类中的成员变量类型进行注入
-->
<!--<bean id="bookService" class="autodi.BookServiceImpl" autowire="byName"/>-->
<!--
类中成员变量的类型与工厂中bean的类型一致则强行注入,否则不注入。
-->
<bean id="bookService" class="autodi.BookServiceImpl" autowire="byType"/>
</beans>
06、spring工厂的细节

07、AOP面向切面编程
7.1、静态代理(proxy)
- 给一幅图做一个简单介绍:
 



7.2、动态代理
7.3、面向切面编程AOP原理概念
7.4、AOP编程的编程步骤
7.4.1引入AOP编程相关的依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
</dependencies>
7.4.2开发项目额外功能通知
7.4.3配置切面spring.xml
7.5、aop编程之环绕通知

7.6、切入点表达式
- 切到某个类,就会为这个类创建 动态代理对象。
 - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OkWIylWL-1604738928148)(https://img.rruu.net/image/5fa0a90a1676a)]
 


08、IOC和AOP的复习

09、spring创建复杂对象
除了我们之前学过的new简单对象,其实还有很多对象是不能new出来的,比如抽象类对象,我们需要用官方提供的方法来对它进行实例化,然后调用实现功能。
对于复杂对象,我们不能交给工厂处理,也不能new处理。那么该如何创建这些复杂对象呢?



10、spring整合mybatis思路分析
10.1、引入依赖



首先引入两个重要依赖:
- 
mysql - 
mybatis 
<!--引入mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--引入mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
</dependencies>
- 
mybatis官方: 
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>

整合spring和mybatis新方法:


10.2、spring整合mybatis编程步骤
10.2.1引入依赖
- 
spring - 
mybatis - 
mysql - 
mybatis-spring - 
Druid 
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<!--引入mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--引入mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!--引入mybatis-spring-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
<!--引入Druid依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.19</version>
</dependency>
</dependencies>
10.2.2配置spring.xml
10.2.3从工厂中获取SqlSessionFactory对象
11、spring整合mybatis DAO层的编程开发

12、spring注解式开发




13、ssm整合注解式开发

14、log4j的使用
其实就是在运行项目的时候,控制台会打印很多日志信息,我们可以选择监听某些类的日志打印信息,也可以屏蔽不想看到的日志信息。

- 引入依赖:
 
<!--log4j的依赖-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
</dependency>
<!--log4j12的依赖-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
- 
log4j配置模板: 
Iog4j.rootLogger =ERROR,bb
1og4j.appender.bb =org.apache.1og4j.ConsoleAppender
1og4j.appender.bb.layout=org.apache.log4j.PatternLayout
log4j.appender.bb.layout.conversion=[%p] %d{yyyy-MM-dd-} %m%n
1og4j.logger.com.linghu.dao=DEBUG
1og4j.logger.org.spring framework=DEBUG
15、事务传播属性【面试会用】
rsion>2.10.0
 org.slf4j
 slf4j-log4j12
 1.7.25
 test
- `log4j`配置模板:
```xml
Iog4j.rootLogger =ERROR,bb
1og4j.appender.bb =org.apache.1og4j.ConsoleAppender
1og4j.appender.bb.layout=org.apache.log4j.PatternLayout
log4j.appender.bb.layout.conversion=[%p] %d{yyyy-MM-dd-} %m%n
1og4j.logger.com.linghu.dao=DEBUG
1og4j.logger.org.spring framework=DEBUG
- [外链图片转存中…(img-grxBafms-1604738928182)]
 - [外链图片转存中…(img-BTyrPftI-1604738928184)]
 
15、事务传播属性【面试会用】
                




























