1.spring7大模块
2.IOC控制反转
ioc控制反转是一种设计思想,DI依赖注入是实现IOC的一种方法。
2.1IOC创建对象的方式:
- 使用无参构造创建对象,默认
- 使用有参构造创建对象
==========1.使用下标赋值========
<bean id="user" class="com.qjq.pojo.User">
<constructor-arg index="0" value="有参构造"/>
</bean>
==========2.使用类型赋值不建议使用,如果多个参数为同一类型赋值会有问题=====
<bean id="user" class="com.qjq.pojo.User">
<constructor-arg type="java.lang.String" value="类型赋值"/>
</bean>
==========3.使用参数名赋值=============
<bean id="user" class="com.qjq.pojo.User">
<constructor-arg name="name" value="通过参数名赋值"/>
</bean>
3.spring配置
3.1alias 别名
<bean id="user" class="com.qjq.pojo.User">
<constructor-arg name="name" value="通过参数名赋值"/>
</bean>
<alias name="user" alias="userNew"/>
3.2import导入
可以将多个配置文件导入到一个中
4.依赖注入
4.1构造器注入
4.2set方式注入
依赖:bean对象的创建依赖于容器
注入:bean对象中的所有属性,由容器注入
复杂对象注入:
public class Student {
private String name;
private String address;
private String[] books;
private List<String> hobbys;
private Map<String,String>card;
private Set<String> games;
private String wife;
private Properties info;
}
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="address" class="com.qjq.pojo.Adderss"/>
<bean id="student" class="com.qjq.pojo.Student">
<!--1.普通值注入-->
<property name="name" value="qjq"/>
<!--2.bean注入-->
<property name="address" ref="address"/>
<!--3.数组注入-->
<property name="books">
<array>
<value>红楼梦</value>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
</array>
</property>
<!--4.list注入-->
<property name="hobbys">
<list>
<value>听歌</value>
<value>敲代码</value>
<value>看电影</value>
</list>
</property>
<!--5.map注入-->
<property name="card">
<map>
<entry key="身份证" value="111111"/>
<entry key="银行卡" value="12131"/>
</map>
</property>
<!--6.set注入-->
<property name="games">
<set>
<value>lol</value>
<value>bbb</value>
<value>vvv</value>
</set>
</property>
<!--7.null注入-->
<property name="wife">
<null/>
</property>
<!--8.properties注入-->
<property name="info">
<props>
<prop key="学号">2019</prop>
<prop key="性别">男</prop>
</props>
</property>
</bean>
</beans>
4.3拓展方式注入
使用c命名空间和p命名空间进行注入
5.bean的作用域
5.1单例模式(spirng默认机制)
<bean id="user" class="com.qjq.pojo.User" scope="singleton"></bean>
5.2多例模式(每次从容器中获取时都会新建一个对象)
<bean id="user" class="com.qjq.pojo.User" scope="prototype"></bean>
5.3其余的request,session,application只能在web开发中使用到
6.bean的自动装配
- 自动装配是spring满足bean依赖的一种方式
- spring会在上下文中自动寻找,并自动给bean装配属性
在spring中有三种装配的方式:
- 在xml中显示的配置
- 在java中配置
- 隐式的自动装配
6.1测试
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cat" class="com.qjq.pojo.Cat"></bean>
<bean id="dog" class="com.qjq.pojo.Dog"></bean>
<bean id="people" class="com.qjq.pojo.People">
<property name="name" value="name"></property>
<property name="dog" ref="dog"></property>
<property name="cat" ref="cat"></property>
</bean>
</beans>
6.2byName自动装配
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cat" class="com.qjq.pojo.Cat"></bean>
<bean id="dog" class="com.qjq.pojo.Dog"></bean>
<!--byName:会自动在容器上下文中查找,和自己对象set方法后面对应的值的bendid-->
<bean id="people" class="com.qjq.pojo.People" autowire="byName">
<property name="name" value="name"></property>
<!-- <property name="dog" ref="dog"></property>
<property name="cat" ref="cat"></property>-->
</bean>
</beans>
6.3ByType自动装配
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cat" class="com.qjq.pojo.Cat"></bean>
<bean id="dog" class="com.qjq.pojo.Dog"></bean>
<!--byName:会自动在容器上下文中查找,和自己对象set方法后面对应的值的bendid
byType:会自动在容器上下文中查找,和自己对象属性类型相同的bend--->
<bean id="people" class="com.qjq.pojo.People" autowire="byType">
<property name="name" value="name"></property>
<!-- <property name="dog" ref="dog"></property>
<property name="cat" ref="cat"></property>-->
</bean>
</beans>
6.4使用注解实现自动装配
使用注解须知:
- 导入约束 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/>
</beans>
@Autowired
可以在属性上使用,也可以在set方法上使用
@qualifier指定一个唯一的bean对象注入
@Resource
@Autowired和 @Resource的区别:
- 都是自动装配的
- @Autowired是通过byName自动装配的,必须存在
- @Resource是默认通过byName自动装配的,如果不存在则在根据byType实现的。两者都不存在则会报错
7.spring使用注解开发
7.1属性注入
package com.qjq.pojo;
import org.springframework.stereotype.Component;
//@Component 组件
@Component
public class User {
private String name="a";
}
7.2衍生的注解
-
@Component衍生的注解
-
dao层:@Repository
- service层:@Service
- controller层:@Controller
这几个注解都是将类注册到spring容器中
8.使用java方式配置spring
8.1实体类
package com.qjq.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class User {
private String name;
public String getName() {
return name;
}
@Value("aaa")
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
配置类:
package com.qjq.config;
import com.qjq.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
public User getUser(){
return new User();
}
}
测试类:
import com.qjq.config.MyConfig;
import com.qjq.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
User user = (User) context.getBean("getUser");
System.out.println(user.getName());
}
}
9.代理模式
9.1代理模式的分类
- 静态代理
- 动态代理
9.2静态代理
抽象角色:一般会使用接口或者抽象类来解决
真实角色:被代理的角色
代理角色:代理真实角色,代理真实角色后会做一些附属操作
客户:访问代理对象的人
代理模式的好处:
- 可以使真实角色的操作更加纯粹
- 公共部分交给代理角色,实现了业务的分工
- 公共业务发生扩展的时候便于集中管理
缺点:一个真实的角色就会产生一个代理角色,代码量会翻倍,开发效率会变低
代码步骤:
==========接口===========
package com.qjq.demo01;
//租房子
public interface Rent {
public void rent();
}
=========真实角色=========
package com.qjq.demo01;
//房东
public class Host implements Rent {
public void rent() {
System.out.println("房东出租房子");
}
}
=========代理角色=======
package com.qjq.demo01;
//代理角色,中介
public class Proxy implements Rent{
private Host host;
public Proxy(Host host) {
this.host = host;
}
public void rent() {
host.rent();
}
public Host getHost() {
return host;
}
public void setHost(Host host) {
this.host = host;
}
@Override
public String toString() {
return "Proxy{" +
"host=" + host +
'}';
}
}
=============客户============
package com.qjq.demo01;
//客户,租房子的
public class Client {
public static void main(String[] args) {
Host host=new Host();
Proxy proxy=new Proxy(host);
proxy.rent();
}
}
9.3动态代理
- 动态代理和静态代理的角色一样
- 动态代理的代理类是动态生成的,不是我们直接写
- 动态代理分为两大类:基于接口的动态代理、基于类的动态代理
- 基于接口:jdk动态代理
- 基于类:cglib
- java字节码实现,javasist
需要了解两个类:proxy代理,InvocationHandler调用处理程序
10.使用spring实现AOP
10.1需要导入的包
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
方式一:使用spring的接口 【主要是spring接口来实现】
方式二:使用自定义来实现aop 【主要是切面来实现】
方式三:使用注解实现
11.整合mybatis
11.1需要导入的包
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
</dependencies>
12.声明式事务