导入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 编程式事务,需要在代码中进行事务的管理