Spring(黑马)
一、基础知识
1.1 传统JavaWeb的缺点
- 传统的JavaWeb在实现某个主要的业务逻辑时需要做的事情:
- new一个实现类对象,然后通过对象调用某个主要的方法;
- 开启事务、提交事务、回滚事务;在日志中记录修改数据;
- 在日志中记录异常数据等。
- 以上传统方法带来的问题:
- 实现类与接口过于耦合--通过工厂模式,以第三方的方式解决耦合问题
- service层事务功能、日志功能都与业务代码过于耦合
1.2 IOC、DI、AOP思想
- IOC:控制反转 即业务层需要用到Bean对象时不再使用new的方式,而是通过第三方(动态代理)来拿到Bean对象,将创建Bean的权力控制反转给第三方。
- DI:依赖注入 即Bean对象需要用到另一个Bean对象时也同样不再使用new的关系,可以直接交给第三方,不需要开发人员在业务层程序代码中进行设置。
- AOP:面向切面编程 即对某一个Bean进行增强,主要是通过代理Proxy。
1.3 框架的概念
- 从众多业务中抽取出来的通用的解决方案。
- 使用了大量的设计模式,如反射、xml解析、注解解析
- 使用简单的代码实现复杂的功能
- 有了框架可以将精力集中于业务开发
1.4 Spring框架
- 官方网站:spring.io 在首页栏的project查看各种框架的学习文档
- Spring Freamwork:(学习主体)
- Core Container:开发时会引入4个jar包(Maven开发时会引入4个坐标)
- Beans
- Core
- Context
- SpEL(表达式)
- AOP(主要学习AOP技术)
- Aspects(切面)
- Data Access/Integration(数据访问层)
- JDBC
- ORM(JDBC框架)
- Transaction(事务)
- Web
- Core Container:开发时会引入4个jar包(Maven开发时会引入4个坐标)
二、快速入门
2.1 BeanFactory快速入门
-
BeanFactory工厂模式 即第三方,需要一个配置文件,对Bean进行一些说明
-
BeanFactory工厂模式的开发步骤(IOC+DI):
【程序代码------>第三方------>配置文件------>Bean类】
-
1、导入第三方 即Spring的jar包或者Maven坐标
-
2、Bean类 即编写UserService接口以及UserServiceImpl实现类
-
3、创建beans.xml配置文件,将UserServiceImpl的信息配置到该xml中
<bean id="userService" class="impl的全类名"> <property name="impl中的方法名去掉test后首字母小写" ref="UserDao的id"></property></bean>
-
4、编写测试用例,创建BeanFactory,加载配置文件,获取UserService实例对象
-
-
Spring核心依赖:
- 1)spring核心依赖
spring-core、spring-beans、spring-context - 2)spring dao依赖(提供JDBCTemplate)
spring-jdbc、spring-tx - 3)spring web依赖
spring-web、spring-webmvc - 4)spring test依赖
spring-test
- 1)spring核心依赖
-
BeanFactory主要的实现类
- DefaultListableBeanFactory
2.2 ApplicationContext快速入门
- ApplicationContext称为Spring容器,内部封装了BeanFactory,后续开发常用。xml文件名称习惯写成applicationContext.xml。
- ApplicationContext开发步骤:
- 1、创建ApplicationContext接口变量指向子类对象--ClassPathXmlApplicationContext
- 2、调用getBean()方法获取userService对象,同时执行了setUserDao()方法
- ApplicationContext主要的实现类
- ClassPathXmlApplicationContext--加载类路径下的ApplicationContext(Spring容器)
- FileSystemXmlApplicationContext--加载磁盘路径下的ApplicationContext
- AnnotationConfigApplicationContext--加载注解配置类的ApplicationContext
2.3 BeanFactory和ApplicationContext的关系
-
BeanFactory是Spring的早期接口,称为Spring的Bean工厂,ApplicationContext是后期更高级的接口,称之为Spring容器
-
BeanFactory的API更偏向底层,ApplicationContext的API大多数是对这些底层API的封装
-
ApplicationContext不仅继承BeanFactory,内部还维护着BeanFactory的引用,所以二者既有继承关系,又有融合关系
-
二者Bean的初始化时机不同,BeanFactory是在首次调用getBean时才进行Bean的创建,而ApplicationContext则是创建容器 配置文件加载的时候将Bean都实例化并且都创建好。
三、基于Xml的Spring应用
3.1 Bean标签的基础配置
- id必须唯一,bean对象有一个默认的name,是class的值;如果配置了id,那么name就是id的值;如果没有配置id,配置了name,那么name就是name的值;如果id和name都没有配置,那么name的值就是默认的class的值。
<bean id=" " name=" " class=""></bean>
-
范围scope(很少配置这个)
- singleton--单例(默认),只创建并且实例化一次对象,每次调用getBean()时使用的都是同一个对象,实例化的对象会存储在Spring容器的单例池中。单例池:singletonObjects.
- prototype--原型,每一次调用getBean()时都会创建并实例化一次对象,因此每个对象都不一样,用完后就销毁,不会存储在容器中。
<bean scope="sington"></bean>
-
延迟加载lazy-init
-
当使用ApplicationContext时,创建容器的时候就会立马实例化并且创建bean对象,如果将lazy-init设置为true时则不会立即创建,而是在使用时创建并且存储到单例池中,本质上仍然是单例的。
<bean lazy-init="true"></bean>
-
-
自定义初始化和销毁方法
-
初始化--在UserServiceImpl中定义init()方法,后在bean标签中配置init-method=init()。init()方法在创建对象后 构造方法执行完后会被调用
-
销毁--在UserServiceImpl中定义destroy()方法,后在bean标签中配置destroy-method=destroy()。destroy()方法会在关闭容器时调用,一般不怎么用。
<bean init-method=init() destroy-method=destroy()></bean>
-
-
Bean传递有参构造参数
<bean><constructor-arg name="age" value="18"></constructor-arg></bean>
-
Bean的实例化方式
-
自定义静态工厂方法实例化Bean
- 1、创建工厂类,自定义静态方法
public class MyFactory { //自定义工厂 实例化Bean public static UserDao factory(){ //Bean创建之前可以进行一些其他的业务逻辑操作 return new UserDaoImpl(); } }
- 2、配置beans.xml文档
<bean id="userDao1" class="com.fresh_yuan.factory.MyFactory" factory-method="factory"></bean>
- 3、测试
public class ApplicationContextTest { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); Object userDao1 = applicationContext.getBean("userDao1"); System.out.println(userDao1); } }
输出结果: com.fresh_yuan.dao.impl.UserDaoImpl@5dd6264
-
自定义实例工厂方法实例化Bean
-
1、创建工厂,方法不使用static修饰
public class MyFactory2 { //自定义实例工厂实例化Bean public UserDao factory2(){//注意方法没有static关键字修饰 System.out.println("实例工厂调用了"); return new UserDaoImpl(); } }
-
2、配置beans.xml(这是重点)
<!-- 首先创建工厂的实例化对象,通过工厂的实例化对象调用非静态方法,从而实例化Bean --> <bean id="myFactory" class="com.fresh_yuan.factory.MyFactory2"></bean> <bean id="userDao2" factory-bean="myFactory" factory-method="factory2"></bean>
-
3、测试
public class ApplicationContextTest { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); //UserService userService = (UserService) applicationContext.getBean("userService"); Object userDao2 = applicationContext.getBean("userDao2"); System.out.println(userDao2); } }
-
-