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