1、Spring框架概述
Spring是轻量级的开源的JavaEE框架 Spring可以解决企业应用开发的复杂性 Spring有两个核心部分:IOC 和Aop
IOC:控制反转,把创建对象过程交给Spring进行管理 Aop:面向切面,不修改源代码进行功能增强 Spring特点
方便解耦,简化开发 Aop编程支持 方便程序测试 方便和其他框架进行整合 方便进行事务操作 降低API开发难度
2、IOC容器(控制反转)
2.1、什么是IOC
控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 使用IOC目的:为了耦合度降低
2.2、IOC底层原理
xml解析、工厂模式、反射
2.3、IOC容器实现两种方式(两个接口)
BeanFactory :IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用
加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象 IOC思想基于IOC容器完成,IOC容器底层就是对象工厂 ApplicationContext :BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用
3、Bean管理的概念
3.1、什么是Bean管理
3.2、Bean管理操作有两种方式
4、基于 xml 方式注入
4.1、基于xml方式创建对象
在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建 在bean标签有很多属性,介绍常用的属性
id属性:唯一标识 class属性:类全路径(包类路径) 创建对象时候,默认也是执行无参数构造方法完成对象创建
4.2、基于xml方式注入属性
4.3、第一种注入方式:使用set方法进行注入
public class Book {
private String bname;
private String bauthor;
public void setBname ( String bname) {
this . bname = bname;
}
public void setBauthor ( String bauthor) {
this . bauthor = bauthor;
}
}
< bean id = " book" class = " com.atguigu.spring5.Book" >
< property name = " bname" value = " 易筋经" > </ property>
< property name = " bauthor" value = " 达摩老祖" > </ property>
</ bean>
4.4、第二种注入方式:使用有参数构造进行注入
public class Orders {
private String oname;
private String address;
public Orders ( String oname, String address) {
this . oname = oname;
this . address = address;
}
}
< bean id = " orders" class = " com.atguigu.spring5.Orders" >
< constructor-arg name = " oname" value = " 电脑" > </ constructor-arg>
< constructor-arg name = " address" value = " China" > </ constructor-arg>
</ bean>
4.5、p名称空间注入(了解)
使用p名称空间注入,可以简化基于xml配置方式 添加p名称空间在配置文件中
<?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: p= " http://www.springframework.org/schema/p" <!--在这里添加一行p-- >
< bean id = " book" class = " com.atguigu.spring5.Book" p: bname= " 九阳神功" p: bauthor= " 无名氏" > </ bean>
5、xml注入其他类型属性
5.1、字面量
< property name = " address" >
< null/>
</ property>
< property name = " address" >
< value> <![CDATA[<<南京>>]]> </ value>
</ property>
5.2、注入属性 - 外部bean
创建两个类 service类和dao类 在service调用dao里面的方法 在spring配置文件中进行配置
public class UserService {
private UserDao userDao;
public void setUserDao ( UserDao userDao) {
this . userDao = userDao;
}
public void add ( ) {
System . out. println ( "service add..............." ) ;
userDao. update ( ) ;
}
}
< bean id = " userService" class = " com.atguigu.spring5.service.UserService" >
< property name = " userDao" ref = " userDaoImpl" > </ property>
</ bean>
< bean id = " userDaoImpl" class = " com.atguigu.spring5.dao.UserDaoImpl" > </ bean>
5.3、注入属性 - 内部bean
一对多关系:部门和员工
一个部门有多个员工,一个员工属于一个部门 部门是一,员工是多 在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示
public class Dept {
private String dname;
public void setDname ( String dname) {
this . dname = dname;
}
}
public class Emp {
private String ename;
private String gender;
private Dept dept;
public void setDept ( Dept dept) {
this . dept = dept;
}
public void setEname ( String ename) {
this . ename = ename;
}
public void setGender ( String gender) {
this . gender = gender;
}
}
< bean id = " emp" class = " com.atguigu.spring5.bean.Emp" > < property name = " ename" value = " lucy" > </ property> < property name = " gender" value = " 女" > </ property> < property name = " dept" > < bean id = " dept" class = " com.atguigu.spring5.bean.Dept" > < property name = " dname" value = " 安保部" > </ property> </ bean> </ property> </ bean>
5.4、注入属性 - 级联赋值
< bean id = " emp" class = " com.atguigu.spring5.bean.Emp" > < property name = " ename" value = " lucy" > </ property> < property name = " gender" value = " 女" > </ property> < property name = " dept" ref = " dept" > </ property> </ bean> < bean id = " dept" class = " com.atguigu.spring5.bean.Dept" > < property name = " dname" value = " 财务部" > </ property> </ bean>
public Dept getDept ( ) {
return dept;
}
< bean id = " emp" class = " com.atguigu.spring5.bean.Emp" >
< property name = " ename" value = " lucy" > </ property>
< property name = " gender" value = " 女" > </ property>
< property name = " dept" ref = " dept" > </ property>
< property name = " dept.dname" value = " 技术部" > </ property>
</ bean>
< bean id = " dept" class = " com.atguigu.spring5.bean.Dept" >
< property name = " dname" value = " 财务部" > </ property>
</ bean>
6、xml注入集合属性
6.1、注入数组、List集合、Map集合类型属性
创建类,定义数组、list、map、set类型属性,生成对应set方法
public class Stu {
private String [ ] courses;
private List < String > list;
private Map < String , String > maps;
private Set < String > sets;
public void setSets ( Set < String > sets) {
this . sets = sets;
}
public void setCourses ( String [ ] courses) {
this . courses = courses;
}
public void setList ( List < String > list) {
this . list = list;
}
public void setMaps ( Map < String , String > maps) {
this . maps = maps;
}
}
< bean id = " stu" class = " com.atguigu.spring5.collectiontype.Stu" >
< property name = " courses" >
< array>
< value> java 课程</ value>
< value> 数据库课程</ value>
</ array>
</ property>
< property name = " list" >
< list>
< value> 张三</ value>
< value> 小三</ value>
</ list>
</ property>
< property name = " maps" >
< map>
< entry key = " JAVA" value = " java" > </ entry>
< entry key = " PHP" value = " php" > </ entry>
</ map>
</ property>
< property name = " sets" >
< set>
< value> MySQL</ value>
< value> Redis</ value>
</ set>
</ property>
</ bean>
6.2、在集合里面设置对象类型值
< bean id = " course1" class = " com.atguigu.spring5.collectiontype.Course" >
< property name = " cname" value = " Spring5 框架" > </ property>
</ bean>
< bean id = " course2" class = " com.atguigu.spring5.collectiontype.Course" >
< property name = " cname" value = " MyBatis 框架" > </ property>
</ bean>
< property name = " courseList" >
< list>
< ref bean = " course1" > </ ref>
< ref bean = " course2" > </ ref>
</ list>
</ property>
6.3、把集合注入部分提取出来
<?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: p= " http://www.springframework.org/schema/p"
xmlns: util= " http://www.springframework.org/schema/util"
xsi: schemaLocation= " http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd" >
< util: list id = " bookList" >
< value> 易筋经</ value>
< value> 九阴真经</ value>
< value> 九阳神功</ value>
</ util: list>
< bean id = " book" class = " com.atguigu.spring5.collectiontype.Book" >
< property name = " list" ref = " bookList" > </ property>
</ bean>
7、工厂bean(FactoryBean)
Spring有两种类型bean,一种普通bean ,另外一种工厂bean(FactoryBean)
普通bean:在配置文件中定义bean类型就是返回类型 工厂bean:在配置文件定义bean类型可以和返回类型不一样 第一步 创建类,让这个类作为工厂bean,实现接口 FactoryBean
第二步 实现接口里面的方法,在实现的方法中定义返回的bean类型
public class MyBean implements FactoryBean < Course > {
@Override
public Course getObject ( ) throws Exception {
Course course = new Course ( ) ;
course. setCname ( "abc" ) ;
return course;
}
@Override
public Class < ? > getObjectType ( ) {
return null ;
}
@Override
public boolean isSingleton ( ) {
return false ;
}
}
< bean id = " myBean" class = " com.atguigu.spring5.factorybean.MyBean" >
</ bean>
@Test
public void test3 ( ) {
ApplicationContext context = new ClassPathXmlApplicationContext ( "bean3.xml" ) ;
Course course = context. getBean ( "myBean" , Course . class ) ;
System . out. println ( course) ;
}
8、bean作用域
在Spring里面,默认情况下,bean是单实例对象
8.1、如何设置单实例还是多实例
在spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例 scope属性值
singleton(默认),表示是单实例对象 prototype,表示是多实例对象
8.2、singleton和prototype区别
singleton单实例,prototype多实例 设置scope值是singleton时候,加载spring配置文件时候就会创建单实例对象 设置scope值是prototype时候,不是在加载spring配置文件时候创建 对象,在调用getBean
方法时候创建多实例对象