1.学习 Spring
1.1 简介
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
1.2 优点
- spring是一个开源的免费的框架
- spring 是一个轻量级的,非侵入式的框架
- 控制反转(IOC),面向切面编程(AOP)!!!!!
- 支持事务的处理,对框架整合的支持
6.依赖注入
6.1、构造器注入
6.2、Set方式注入【重点】
- 依赖注入:Set注入
-
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象中的所有属性,由容器来注入
【环境搭建】
- 复杂类型
package com.xiao.pojo;
public class Address {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
- 真实测试对象
public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobby;
private Map<String,String>card;
private Set<String> games;
private Properties info;
private String wife;
- beans.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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<!-- 第一种:普通值注入 :value -->
<bean id ="student" class="com.xiao.pojo.Student">
<property name="name" value = "肖"/>
</bean>
</beans>
- 测试类
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Student student = (Student) context.getBean("student");
System.out.println(student.getName());
}
}
- 完善注入信息
<!-- 第一种:普通值注入 :value -->
<bean id="address" class="com.xiao.pojo.Address"/>
<bean id ="student" class="com.xiao.pojo.Student">
<property name="name" value = "肖"/>
<!-- 第二种:Beans注入,ref -->
<property name="address" ref="address"/>
<!-- 第三种:数组注入,ref -->
<property name="books">
<array>
<value>红楼梦</value>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
</array>
</property>
<!-- list -->
<property name="hobbys">
<list>
<value>听歌</value>
<value>敲代码</value>
<value>看剧</value>
</list>
</property>
<!-- map -->
<property name="card">
<map>
<entry key="身份证" value="11111111111111111"/>
<entry key="银行卡" value="122222222222222112"/>
</map>
</property>
<!-- Set -->
<property name="games">
<set>
<value>LOL</value>
<value>COC</value>
<value>BOB</value>
</set>
</property>
<!-- null -->
<property name="wife">
<null/>
</property>
<!-- Properties -->
<property name="info">
<props>
<prop key="学号">19103224</prop>
<prop key="性别">女</prop>
<prop key="username">root</prop>
</props>
</property>
</bean>
</beans>
6.3、拓展方式注入
p和c
注意点:p命名和c命名空间不能直接使用,需要导入xml约束
6.4、bean的作用域
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cSGZdhJD-1603897512110)(C:\Users\Administrator.SC-202001221340\AppData\Roaming\Typora\typora-user-images\image-20201024224020154.png)]
7.bean的自动装配
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文中自动寻找,并给出bean装配属性
在Spring中有三种装配方式
- 在xml中显示的配置
- 在java中显示配置
- 隐式的自动装配bean【重要】
7.1、测试
7.2、ByName自动装配
7.3、ByType自动装配
小结:
- ByName的时候,需要保证所有的bean的id唯一,并且这个bean需要和自动注入的属性的set方法一致
- ByType的时候,需要保证所有的bean的classid唯一,并且这个bean需要和自动注入的属性的类型一致
7.4、使用注解实现自动装配
jdk1.5支持的注解,Spring2.5就支持注解了
要使用注解须知:
1.倒入约束 context约束
2.配置注解的支持:context:annotation-config/【重要】
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
@Autowired
直接在属性上面使用即可!也可以在set方式上面使用
使用Autowured我们可以不用编写Set方法了,前提是你这个自动装配的属性在IOC(Spring)容器钟存在且符合咱们的名字!
如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注释【@Autowired】完成的时候,我们可以使用】@Qualifter(value=“xxx”)去配合使用,指定一个唯一的bean对象注入!
@Resource功能最强大(没有仔细看)!通过byType实现,他们两个都是常用的!
执行顺序不同:
@Resource
8、使用注解开发
在spring4之后,要是用注解开发。必须要保证aop的包导入了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SvSPyagp-1603897512111)(C:\Users\Administrator.SC-202001221340\AppData\Roaming\Typora\typora-user-images\image-20201025084448429.png)]】
使用注解需要导入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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解的支持-->
<context:annotation-config/>
- bean
- 属性如何注入
- 衍生的注解
- @Component有几个衍生的注解,我们在web开发中,会按照mvc三层架构分层!
- dao【@repository】
- service【@Service】
- controller【@Controller 】
这四个注解都是一样的,都是代表某个类注册到Spring中,装配Bean
-
自动配置装置
-
作用域
package com.xiao.pojo;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
//等价于<bean id = "user" class = "com.xiao.pojo.User";
//组件
@Component
@Scope("")
public class User {
public String name = "肖";
}
- 小结
- xml用来管理bean
- 注解只负责完成属性的注入
- 我们在使用的过程中,只需要注意一个问题:必须让注解生效,就需要开启注解的支持
<!--开启注解的支持-->
<context:component-scan base-package="com.xiao.pojo"/>
<context:annotation-config/>
9、使用java的方式配置Spring
我们消灾要完全不使用spring的配置了,全权交给java’来做
JavaConflg是Spring的一个子项目,Spring4之后,他成为了一个核心功能
10、代理模式
为什么要学代理模式?因为这就是SpringAOP的底层!
代理模式的分类
- 静态代理
- 动态代理
10.1、静态代理
角色分析:
- 抽象角色:一般会使用接口或者抽象类来解决
- 真实角色:被代理的角色
- 代理角色:代理真实角色,代理真实角色后,一般会做一些附属操作
- 客户:访问代理对象的人
代码步骤:
- 接口
package com.xiao.demo01;
public interface Rent {
public void rent();
}
- 真实角色
//房东
public class Host implements Rent {
public void rent() {
System.out.println("房东要出租房子");
}
}
- 代理角色
package com.xiao.demo01;
public class Proxy implements Rent{
private Host host;
public Proxy() {
}
public Proxy(Host host) {
this.host = host;
}
public void rent() {
seeHouse();
host.rent();
hetong();
fare();
}
//看房
public void seeHouse(){
System.out.println("中介带你看房子");
}
//收中介费
public void fare(){
System.out.println("收中介费");
}
//签合同
public void hetong(){
System.out.println("签租赁合同");
}
}
- 客户端访问代理角色
package com.xiao.demo01;
public class Client {
public static void main(String[] args) {
//房东要租房子
Host host = new Host();
//代理:中介帮房东租房子,但是呢?代理角色一般会有一些附属操作!
Proxy proxy = new Proxy(host);
//你不用面对房东。直接找中介
proxy.rent();
}
}
代理模式的好处:
- 可以使真实操作的角色更加纯粹!不用去关注一些公共的业务
- 公共也就交给了代理角色!实现了业务的分工
- 公共业务发生拓展的时候,方便集中管理
缺点:一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率会变低
10.3、动态代理
- 动态代理和静态代理角色一样
- 动态代理的代理类是动态生成的,不是我们直接写的
- 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
-
- 基于接口—JDK动态代理
- 基于类:cglib
- java字节码实现:javasist
需要了解两个类:Proxy,InvocationHandler:调用处理程序
InvocationHandler
11、AOP
方式一:使用Spring的接口
方法二:自定义类来实现AOP
方式三:使用注解
12、整合Mybatis
步骤:
- 导入相关jar包
- junit
- mybatis
- mysql数据库
- spring相关的
- aop置入
- mybatis-spring [new]
- 编写配置文件
- 测试
12.1、回忆mybatis()
- 编写实体类
- 编写核心配置文件
- 编写接口
- 编写Mapper.xml
- 测试
13、声明式事务
事务的ACID原则:
- 原子性
- 一致性
- 隔离性
的 - 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
-
- 基于接口—JDK动态代理
- 基于类:cglib
- java字节码实现:javasist
需要了解两个类:Proxy,InvocationHandler:调用处理程序
InvocationHandler
11、AOP
方式一:使用Spring的接口
方法二:自定义类来实现AOP
方式三:使用注解
12、整合Mybatis
步骤:
- 导入相关jar包
- junit
- mybatis
- mysql数据库
- spring相关的
- aop置入
- mybatis-spring [new]
- 编写配置文件
- 测试
12.1、回忆mybatis()
- 编写实体类
- 编写核心配置文件
- 编写接口
- 编写Mapper.xml
- 测试
13、声明式事务
事务的ACID原则:
- 原子性
- 一致性
- 隔离性
- 持久性