导入jdbc jar包
spring:导入jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.18</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.18</version>
</dependency>
spring优点:
1.spring是一个开源的免费框架(容器)!
2.spring是一个轻量级的,非入侵式的框架。
3.控制反转(ioc),面向切面编程(aop)。
4.支持事务的处理,对框架整合的支持。
spring就是一个轻量级的控制反转(ioc)和面向切面编程(aop)的框架!
spring boot:
一个快速开发的脚手架
基于springboot可以快速的开发单个微服务
约定大于配置
spring cloud
springboot的是基于springboot实现的
因为现在大多数公司都在使用spring boot快速开发,学习spring boot的
前提,需要完全掌握spring及springMVC承上启下作用。
spring弊端:发展太久配置太多。
暂时不知道有什么用(配置输出)
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
springbeans配置文件
<?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-3.0.xsd">
</beans>
//通过xml加载就必须写这句话
ApplicationContext context = new ClassPathXmlApplicationContext();
!注意千万不要在spring pon.xml里乱导包,不然可能会出现问题
4.创建对象的方式
1.使用无参构造创建对象,默认!
2.假设我们要使用有参构造创建对象。
1.下标复制
<constructor-arg index="0" value="鲁家见"/>
2.通过类型不建议使用
<constructor-arg type="java.lang.String" value="你好啊"/>
3.通过参数名创建对象重点掌握
<constructor-arg name="name" value="这是通过参数名直接赋值"/>
总结:在配置文件加载的时候,容器中管理的对象就已经初始化了。
5.spring配置
5.1别名
<alias name="student" alias="Text1"/>
通过name也可以取别名,而且还可以取多个别名用逗号分隔
<bean id="student" class="pojo.Student" name="s1">
5.2bean的配置
5.3import
这个import,一般用于团队开发使用,他可以将多个配置文件,导入
合并为一个。
假设,现在项目中有多个人开发,这几个人复制不同的类开发,不同类需要
注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个
总的。使用的时候,直接使用总的配置就可以了。
<import resource="beans.xml"/>
<import resource="beans.xml"/>
<import resource="beans.xml"/>
6.依赖注入
6.1构造器注入
前面说过了
6.2set方式注入(重点)
依赖注入
依赖:bean对象的创建依赖于容器
注入:bean对象中的所以属性,用容器来注入
环境搭建
1.复杂类型
2.真实测试对象
6.3其他方式注入
<bean id="address" class="pojo.Address"/>
<bean id="student" class="pojo.Student">
<!--第一种普通注入value-->
<property name="name" value="张三"/>
<!--第二种bean注入ref-->
<property name="address" ref="address"/>
<!--数组注入-->
<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="34242342423423"/>
<entry key="结果" value="借的"/>
</map>
</property>
<!--set集合-->
<property name="games">
<set>
<value>英雄联盟</value>
<value>穿越火线</value>
<value>王者荣耀</value>
</set>
</property>
<!--空值注入null-->
<property name="wife">
<null/>
</property>
<!--配置文件注入Properties-->
<property name="info">
<props>
<prop key="driver">2019502</prop>
<prop key="url">男</prop>
<prop key="username">root</prop>
<prop key="password">root</prop>
</props>
</property>
</bean>
c和p命名空间注入
p命名就是set方式注入,需要无参构造和set方法,
c命名就是构造器注入,需要有参构造
p和c不能直接使用要导入约束xml文件
xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
6.4bean的作用域
1.单列模式spring默认单例模式
User bean = (User) context.getBean("user1");
User bean1 = (User) context.getBean("user1");
System.out.println(bean==bean1);为真
2.原型模式每次从容器中get的时候,都会产生一个新对象
<bean name="user1" class="pojo.User" c:name="鲁家见" c:age="2639" scope="prototype"/>
3.其余的request,session,application,这些个只能在web开发中使用到。
7.bean的自动装配
1.自动装配是spring满足bean依赖一种方式
2.spring会在上下文中自动寻找,并自动给bean装配属性
在spring中有三种装配的方式
1.在xml中显示的配置
2.在java中显示配置
3.隐式的自动装配bean(重要)
7.1测试
搭建环境(一个人两个宠物)
7.2byName自动装配
byname会自动在容器上下文中查找,和自己对象set方法后面的值对应
的beanid!
<bean id="poto" class="pojo.PoTo" autowire="byName">
<property name="name" value="你是那位"/>
</bean>
7.3ByType自动装配
byType会自动在容器上下文中查找,和自己对象属性类型相同的bean
小结:
byName的时候,需要保证所以bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致
byType的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致
7.4使用注解实现自动装配
使用注解需知:
1.导入约束:context约束
2.配置注解的支持:<context:annotation-config/>
3.添加了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">
</beans>
@Autowired
直接在属性上使用即可!也可以在set方式上使用!
使用Autowired我们可以不要编写set方法了,前提是你这个自动装配属性在ioc(spring)容器中
存在,且符合名字byName
如果显示定义了Autowired的required属性false说明这个对象可以为null,负责不允许为空
如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解(@Autowired)完成的时候,
我们可以使用@Qualifier(value = "")去配置@Autowired的使用,指定一个唯一的bean对象注入!
小结:
1.都是用来自动装配的,都可以放在属性字段上
2.@Autowired默认用byType,找不到再用byName
3.@Resource默认通过byname的方式实现,如果找不到名字,则通过bytype实现!如果
两个都找不到的情况下,就报错
使用@Resource需要导入
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.2</version>
</dependency>
8.使用注解开发
在spring4之后使用注解开发,必须保证aop包导入了
<!--指定要扫描的包这个包下的注解就会生效-->
<context:component-scan base-package="pojo" />
//<bean name="student" class="pojo.Student"/>等价于@Component说明此类被spring管理了
@value("你是那位")相当于<property name="name" value="你是那位"/>
3.衍生的注解
@Component有几个衍生注解,在我们web开发中,会按照mvc三层架构分层
dao(@Repository)
service(@Service)
controller(@Controller)
这四个注解的功能都是一样的,都代表将某个类注册spring中,装配到bean中
9.动态代理
需要了解两个类:proxy:代理 InvocationHandler:调用处理程序
自动生成代理工具类
public class PIH implements InvocationHandler {
//被代理的类
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//生成得到代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
@Override//处理代理实例并返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(target,args);
return invoke;
}
}
10.Spring AOP
使用spring AOP 要导入
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjlib</artifactId>
<version>1.6.2</version>
</dependency>
配置aop导入aop约束
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<bean id="studentServiceImp" class="service.StudentServiceImp"/>
</beans>
11.整合mybatis
spring连接数据库要用的包 <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.18</version>
</dependency>
<!--使用spring连接数据库的话还需要一个spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.18</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
</dependencies>
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--dataSource使用spring的数据源替换mybatis的配置-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!--SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--绑定mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="dao/*.xml"/>
</bean>
<!--sqlSession这个就是SqlSessionTemplate-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--只能使用构造器注入sqlSessionFactory,因为他没有set方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<bean id="studentMapper" class="dao.StudentMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
</beans>
Spring中的事务管理
声明式事务aop
编程式事务,需要在代码中进行事务的管理