1、Spring框架概述
2、ioc容器
3、aop
4、jdbcTemplate
5、事务管理
6、spring5新特性
一、Spring框架概述
1、spring框架是一个轻量级的开源的java EE开发框架。
2、spring框架解决企业应用开发的复杂性。
3、spring有两个核心:IOC与AOP
(1)、IOC:控制反转,把创建对象过程交给Spring管理。
(2)、AOP:面向切面编程,不修改源代码情况下,进行功能增强。
4、spring特点
(1)方便解耦,简化开发
(2)aop支持
(3)方便程序测试
(4)方便集成各种框架
(5)降低Java api使用难度
(6)方便进行事务处理
5、选取spring 5.2.6版本
6、入门案例
(1)下载spring
(2) idea 新建普通Java工程
(3) 导入spring 的jar包。(bean,core,context,core,expresstion+commons-logging)
(4)写代码
(4.1)、创建普通类,类里面创建普通方法。
public class User{
public void add(){
system.out.println("add....");
}
}
(5)创建spring配置文件,在配置文件中创建对象
(5.1)新建.xml配置文件
二、IOC容器(IOC:实体类确定好类间的关系,使用xml文件按照实体类配置对象的各种属性,工厂根据XML文件创建对象。)
(1)IOC底层原理
(2)IOC 接口(BeanFactory)
(3)IOC操作Bean管理(基于xml)
什么是ioc
(1),控制反转,目的:降低耦合度,高内聚,低耦合。把对象创建和对象之间的调用过程,交给Spring进行管理。
(2)底层原理
(2.1)xml解析、工厂模式,反射()
(3)IOC接口
(3.1)ioc思想基于IOC容器完成,ioc容器底层就是对象工厂。
(3.2)spring提供了IOC容器实现的两种方式:两个接口,一个是BeanFactory:IOC容器基本实现,是spring内部使用接口,不提供开发人员使用。加载配置文件时不会创建对象,使用对象时才会创建对象(懒汉式加载对象)。
另一个是ApplicationContext:BeanFatory的子接口,提供更多更强大的功能,一般供开发人员进行使用。
加载配置文件时就创建对象(饥汉式加载对象)。
(3.3)pplicationContext接口实现类
FileSystemXmlApplicationContext(“盘符路径(绝对路径)”)
ClassPathXmlApplicationContext("src目录下类路径")
(3.4)子接口ConfigurableApplicationContext()扩展功能
(4)二种注入方式,无参构造注入与有参构造注入,下面使用有参构造进行注入
(4.1)创建类,定义属性,创建属性对应有参构造方法
public Student{
int num;
String name;
public student(int num,string name){
this.num = num;
this.name = name;
}
}
(4.2)Spring 配置文件中配置
或者
(5)p命名空间注入
(5.1) 使用p命名空间配置,可以简化基于xml配置方式
(5.1.1)第一步在配置文件中添加p命名空间
第二步,进行属性注入,在Bean签里面进行操作
(6)IOC操作Bean管理(xml注入其他类型属性)
(6.1)字面量
public class Book{
private String name;
private String author;
private String address;
public void setname(String name){this.name = name;}
public void setauthor(String author){this.author = author;}
public void setaddress(String address){this.address = address;}
public void show(){
system.out.println(name+":"+author+":"+address);
}
}
(6.1.1)null值
(6.1.2)属性值包含特殊符号
//方法一:转义字符
//方法二:CDATA
]]>
(6.2)注入外部bean(使用引用,注入其他类的对象)
(6.2.1)创建两个类service类和dao类
(6.2.2) 在service调用dao类的方法
(6.2.3)在spring配置文件中进行配置
public interface DAO{
public void update(){};
}
public class DAOimp implement DAO{
@override
public void update(){
system.out.println("dao.......");
}
}
public class UserService{
//原来注入方式
// DAO dao = new DAO();
// dao.update();
//新的注入方式
//第一步,创建DAO类属性,生成set方法
private DAO dao;
public void setdao(DAO dao){
this.dao = dao;
}
public void show(){
system.out.println("service.......");
}
}
//第二步写配置文件xml文件
//配置service 对象
//注入dao对象
//配置dao 对象
(6.3)内部bean和级联赋值(property属性中注入,其它类对象)
(6.3.1)一对多的关系:部门和员工
一个部门有多个员工,一个员工属于一个部门,部门是一,员工是多。
(6.3.2)在实体类之间表示一对多的关系
//部门类
public class Department{
String Department_name;
public void setDepartment(String Department_name)
{
this.Department_name = Department_name;
}
@override
public String tostring()
{
system.out.println("Department_name"+this.Department_name);
}
}
//员工类
public class Emplyee{
String Emplyee_name;
String Emplyee_gender;
Department department;
public void setdepartment(String department)
{
this.department = department;
}
public void setEmplyee_name(String Emplyee_name)
{
this.Emplyee_name = Emplyee_name;
}
public void setEmplyee_gender(String Emplyee_gender)
{
this.Emplyee_gender = Emplyee_gender;
}
}
//配置xml
//设置两个普通属性
//设置一个对象
(6.4)级联赋值
(6.4.1)第一种方法
//配置xml
//设置两个普通属性
//内部bean注入的方式,级联赋值
//外部bean注入的方式,级联赋值
(6.4.2)第二种方法
//配置xml
//设置两个普通属性
//外部bean注入的方式,级联赋值
(6.5)注入集合
(6.5.1)注入数组类型
(6.5.2)注入LIST集合
(6.5.3)注入map集合
//1、创建实体类
public void Student{
//数组类型
private String[] course;
//list类型
private List list;
//map类型
private Map map;
//set类型
private Set sets;
public void setCourse(String course){
this.course = course;
}
public void setlist( List list){
this.list = list;
}
public void setMap(Map map){
this.map = map;
}
public void setMap(Set sets){
this.sets = sets;
}
}
//2、配置xml文件
//注入数组
java
c++
c
python
//注入list
张三
李四
王五 s
马六
//注入map
//注入set
张三
李四
王五 s
马六
(6.5.4)集合里设置对象类型值
//1、创建课程类
public void Course{
private String CourseName;
public void setName(String CourseName){
this.CourseName = CourseName;
}
}
//2、创建学生类
public void Student{
//list类型
private List courseList;
public void setcourseList(List courseList){
this.courseList = courseList;
}
}
//xml
//注入list对象,外部bean注入
(6.5.5)把集合诸如部分提取出来
//1、xml中引入新的命名空间util
//2、使用util标签
三国演义
水浒传
西游记
红楼梦
//3、注入使用
(7) FactoryBean
(7.1)Spring有两种Bean,一种普通Bean.另一种是工厂Bean.
(7.2)普通bean,在配置文件中,定义bean类型就是返回类型
(7.3)工厂bean,在配置文件中定义bean类型可以和返回类型不一样
第一步创建类,让这个类作为工厂Bean,实现接口FactoryBean
第二步实现接口里的方法,在实现方法中定义返回的bean类型。
//实现接口类
public class MyBean implements FactoryBean{
@override
public Course getObject() throws Exceptions{
Course course = new Course();
course.setCourse("java");
return course;
}
@override
public Class> getObjectType(){
return NULL;
}
@override
public Boolean isSingleton(){
return false;
}
}
//配置类
//测试类
@test
public void test2(){
ApplicationContext application = new classPathXpthXmlApplicationContext("bean4.xml");
Course course = context.getBean("MyBean",Course.class);
}
(8)bean的作用域
(8.1)在spring里,设置创建Bean实例是单实例还是多实例。
(8.2)在spring里,默认设置创建Bean实例是单实例。
(8.3)如何设置单实例还是多实例。
spring配置文件bean标签里scope属性用于设置单实例还是多实例。
scope属性值:第一个,默认值,singleton,表示单实例对象;第二个值:prototype,表示多实例对象。
//配置
()singleton与prototype
第一,singleton表示单实例,prototype表示多实例。
第二,设置Scope是singleton时,加载spring配置文件时侯就会创建单实例对象;
设置Scope是prototype时,不是加载spring配置文件时侯创建对象,而是在调用getBean方法时创建多实例对象。
request,表示一次请求,每次创建对象放到request域对象中。
session,表示一次会话,每次创建对象放到session域对象中。
(9)Bean生命周期
(9.1)从对象创建到对象销毁的过程。
(9.2)bean生命周期
(9.2.1)通过构造器创建Bean实例(无参构造)
(9.2.2)为bean的属性设置值和对其他bean的引用(调用set方法)
(9.2.3)调用bean的初始化方法(需要进行配置初始化的方法)
(9.2.4)bean可以使用(获取到对象)
(9.2.5)当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)
//实体类
public class Orders{
//无参构造
public Orders(){
System.out.println("第一步;调用无参构造方法");
}
private String order_name;
public void setOrder_name(String order_name){
this.order_name = order_name;
System.out.println("第二步;调用set方法,设置属性值");
}
//创建执行的初始化方法
public void initMethod(){
System.out.println("第三步;执行初始化方法")
}
//创建执行的销毁方法
public void destoryMethod(){
System.out.println("第五步;执行销毁方法")
}
}
//xml
//测试类
public void testBean3(){
//ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Orders order = context.getBean("orders",Orders.class);
System.out.println("第四步;获取创建bean实例对象");
System.out.println(oders);
//手动销毁
context.close()
}
(9.3)bean后置处理器bean生命周期有7步
(9.3.1)通过构造器创建Bean实例(无参构造)
(9.3.2)为bean的属性设置值和对其他bean的引用(调用set方法)
(9.3.3)把bean实例传到bean后置处理器的方法
(9.3.4)调用bean的初始化方法(需要进行配置初始化的方法)
(9.3.5) 把bean实例传到bean后置处理器的方法
(9.3.6)bean可以使用(获取到对象)
(9.3.7)当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)
//创建类,实现接口BeanPostProcessor,创建后置处理器
public class MyBeanPost implements BeanPostProcessor{
@override
public Object postProcessBeforeInitialization(Object bean,String beanName)throws BeanException{
System.out.println("初始化方法之前执行");
return bean;
}
@override
public Object postProcessAfterInitialization(Object bean,String beanName)throws BeanException{
System.out.println("初始化方法之后执行";
return bean;
}
}
//配置后置处理器,当前配置文件的所有bean都会执行该后置处理器
(10)xml方式的自动装配
(10.1)什么是自动装配
根据指定的装配规则(属性名或者属性类型),Spring自动将匹配的属性值进行注入。
//实体类
public class Emp{
private Dept dept;
public void setDept(Dept dept){
this.dept=dept;
}
@override
public String toString(){
return "Dept"+dept;
}
}
public class Dep{
@override
public String toString(){
return "Dept";
}
}
//手动装配xml
//自动装配,autowire属性,
//byName根据属性名称注入,注入值bean的id值和类属性名称一样
//自动装配,autowire属性,byType根据属性类型注入
//byType只能有一个该类型实例,多个实例会报错
//测试类
(11)引入外部属性文件(数据库为例)
(11.1)第一种方法:直接配置数据库信息
(11.2)第二种方法:引入外部属性文件配置数据库连接池
步骤:
(第一步)引入连接池依赖
(第二步)配置德鲁伊连接池
//1、固定值直接配置连接池
//2、引入外部的文件配置连接池
//(2.1)创建外部属性文件,properties格式文件,写出数据库信息
prop.driverClass = com.mysql.jdbc.Driver
prop.url = jdbc:mysql://localhost:3306/userDataBase
prop.user = root
prop.password = root
//(2.2)properties文件引入到spring配置文件中
//(2.2.1)引入名称空间context
//(2.2.2)spring配置文件中进行引入
//(2.2.3)配置连接池
(10)基于注解方式
格式:@注解名称(属性名=属性值,属性名=属性值)
使用注解:注解作用在类(方法,属性)上
使用目的:简化xml配置
(10.1)创建对象注解(4个)
@Component 普通用法
@Service 用于service业务逻辑层
@Controller 用于web层
@Repository 用于DAO持久层
上面四个注解功能一样,都可以用来创建bean对象
基于注解方式实现对象创建例子
//1、引入依赖
spring-aop-5.2.6.RELEASE
//2、引入context名称空间
//3、开启组件扫描,多个包,使用逗号隔开,或者写共同的上层目录
//创建类并使用注解
//value值默认值为首字母小写的类名
@service(value = "userService")
public class UserService{
public void searchAll(){
System.out.println("seach all");
}
}
//测试方法
@test
public void testService(){
ApplicationContext context = new classPathXmlApplicationContext("bean.xml");
UserService uservice = context.getBean("userService",Uservice.class);
System.out.println(userservice);
userservice.searchAll();
}
(10.2)组件扫描配置
//use-default-filters=false表示现在不使用默认filter,自己配置filter
//include-filter配置扫描的注解
//exclude-filter配置不扫描的注解
(11)基于注解方式实现属性注入
(11.1)@Autowired :根据属性类型进行注入
(11.2) @Qualifier :根据名称注入
(11.3) @Resource :可以根据类型注入也可以根据名称注入
(11.4)@Value:注入普通类型属性
(12)完全注解开发
//完全注解开发
//(1)配置类,代替配置文件
@CompanScan(basePackages = {"com.zhh"})
@Configuration //作为配置类,代替xml文件
public class SpringConfig{
}
//(2)创建类并使用注解
//value值默认值为首字母小写的类名
@service(value = "userService")
public class UserService{
public void searchAll(){
System.out.println("seach all");
}
}
//(2)编写测试类
public class TestSpringDemo{
@test
public void testService(){
ApplicationContext context = new ClassPathApplicationContext("bean1.xml");
UserService userService = context.getBean("userService",UserService.class);
System.out.println(userService);
userService.add();
}
@test
public void testService(){
ApplicationContext context = new AnnotationConfigApplicationContext("bean1.xml");
UserService userService = context.getBean("userService",UserService.class);
System.out.println(userService);
userService.add();
}
}