1 框架简介
- 盖房子的时候搭建的架子
- 自己编码的时候遵循框架的约束即可
2 Java中的框架
2.1 Struct2 Spring Hibernate
2.2 SpringMvc Spring Mybatis
2.3 SpringBoot
3 Spring核心(JavaBean的管理)
3.1 IOC(控制反转)
- 把对象的创建权交给Spring容器
3.2 DI(依赖注入)
- 在把对象交给IOC容器的时候,注入对象的属性
3.3 AOP(面向切面编程)
- 是面向对象的功能延伸.不是替换面向对象,是用来解决OOP(面向对象编程)中一些问题.
4 Spring优点
4.1 方便解耦 简化开发
把所有对象的创建交给Spring管理
4.2 支持Aop编程
解决在OOP中遇到的一些问题
4.3 声明式事务的支持
4.4 方便调试程序
在spring中有专门的调试模块Spring-Test
4.5 方便集成各种优秀的框架
Spring对各种主流的框架都提供了支持
4.6 Spring对一些比较难用的API都进行了封装,方便了程序猿的使用(邮件 远程调用…)
5 日志框架
**log4j**:开源的优秀的日志框架 --->logback
..........
**日志门面**:运行这些日志系统的
slf4j
logging (apache的日志门面)
Log log4j = Log log4j = LogFactory.getLog(TestLog.class);
log4j.info("info");
log4j.debug("debug");
log4j.error("error");
6 Spring的入门
6.1 pom依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
6.2 创建log4j的配置文件
log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug, stdout
6.3 创建Spring的配置文件
在resources目录下创建applicationContext.xml
引入XML的约束:
<?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.xsd">
<!--把User叫给Spring来管理-->
<bean id="user" class="com.uplooking.spring.ops1.User"></bean>
</beans>
6.4 使用ApplicationContext创建对象
//创建Spring的工厂对象(BeanFactory AppplicationContext)
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//使用applicationContext.xml中配置的id来获取对象(Spring内部会帮我们创建对象==>IOC)
User user = (User) applicationContext.getBean("user");
System.out.println(user);
7 ApplicationContext BeanFactory的区别
- ApplicationContext继承自BeanFactory
- 在老版本的Spring中使用的是BeanFactory,在新版本的Spring中使用ApplicationContext
- BeanFactory会在调用getBean时候实例化对象
- ApplicationContext会在容器加载时把Spring容器管理的所有的Bean实例化(仅对scope="singleton"有效)
- scope有两个属性值:
singleton(单例模式)
和prototype(多例模式)
,默认为singleton(单例模式)
8. bean中的name和id属性
- name与id都是用来给Spring管理的对象命名的
- id遵循的是xml的规范(唯一)
- name可以配置多个(name=“user,user2,user3”)
- name可以出现特殊字符,id不能出现特出字符
- 一般使用id即可
9 Spring管理对象的创建的方式
9.1 使用构造器创建对象(默认)
class User {
public User() {
System.out.println("构造方法...");
}
}
<!--默认使用无参数的构造器来创建对象的-->
<bean id="user" class="com.uplooking.spring.ops1.User">
</bean>
9.2 使用静态工厂创建对象
public class UserFactory {
public User static newInstance() {
return new User();
}
}
<!--使用静态工厂实例化对象-->
<bean id="user" class="com.uplooking.spring.ops1.UserFactory" factory-method="newInstance"></bean>
9.3 使用实例工厂创建对象
public class UserFactory {
public User newInstance() {
return new User();
}
}
<!--使用实例工厂来创建对象-->
<bean id="userFactory" class="com.uplooking.spring.ops1.UserFactory"></bean>
<bean id="user" factory-bean="userFactory" factory-method="newInstance"></bean>
注意:
使用静态工厂创建对象时,工厂方法必须是static静态的;
使用实例工厂创建对象时,工厂方法不能是静态的
10. 属性的注入(DI)
DI:依赖注入==>在对象的创建过程中给属性赋值
- 用构造器注入
<!--使用构造器注入属性-->
<constructor-arg name="name" value="小花"></constructor-arg>
<constructor-arg name="age" value="23"></constructor-arg>
- 用setter方法注入
<!--setter方法注入 property的name属性值为: setter方法的名字的首字母小写-->
<property name="name" value="admin"></property>
<property name="userDao" ref="userDao"></property>
在实际开发过程中推荐使用setter方法注入的方式
11. IOC与DI的区别
IOC:把对象的创建权交给Spring容器
DI:创建对象时注入对象的属性
面试题: IOC与DI有什么区别?
IOC: 对象的创建权
交给Spring,Spring的容器来管理这些对象
DI: 依赖注入; 在Spring创建对象的过程中注入对象的属性;
12. Bean的作用范围
scope="singleton" 全局创建一个实例
scope="prototype" 当ApplicationContext调用getBean()时,创建对象,每调用一次创建一个对象
13. Bean的初始化和销毁
public class User {
public void init() {
System.out.println("初始化方法...init()");
}
public void destory() {
System.out.println("销毁方法....destory()");
}
<bean id="user" class="com.xzy.spring.ops1.User" scope="singleton" init-method="init" destroy-method="destory"/>
/*容器创建时,会创建配置的Bean的对象,并且执行init()方法,*/
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
/*Spring容器关闭时执行销毁的方法*/
applicationContext.close();
14. Bean的生命周期(了解)
- instantiate bean对象实例化(如果
scope="singleton"
时,在容器加载时创建实例) - 封装属性(DI)调用setter方法
- 如果存在类实现 BeanPostProcessor(初始化之前执行) ,执行postProcessBeforeInitialization(aop的底层)
- 调用 指定初始化方法 init
- 如果存在类实现 BeanPostProcessor(初始化之后执行) ,执行postProcessAfterInitialization
- 配置了 ,指定销毁方法
15 DI的复杂属性的注入
15.1 普通的字面量的注入
<bean id="user" class="com.uplooking.spring.ops1.User"/>
<property name="name" value="小花"/>
<property name="age" value="23"/>
</bean>
15.2 对象注入
<bean id="orders" class="com.uplooking.spring.ops1.Orders">
<!--对象的注入-->
<property name="user" ref="user"/>
</bean>
15.3 Map的注入
<bean id="user" class="com.uplooking.spring.ops1.User">
<property name="name" value="小花花"></property>
<property name="age" value="17"></property>
<property name="map">
<map>
<entry key="k1" value="v1"/>
<entry key="k2" value="v2"/>
<entry key="k3" value="v3"/>
</map>
</property>
</bean>
15.4 List的注入
<bean id="user" class="com.uplooking.spring.ops1.User">
<property name="name" value="小花花"></property>
<property name="age" value="17"></property>
<property name="loves">
<list>
<value>java</value>
<value>c++</value>
<value>c</value>
</list>
</property>
</bean>
15.5 List中存放对象
<bean id="orders" class="com.uplooking.spring.ops1.Orders">
</bean>
<bean id="user" class="com.uplooking.spring.ops1.User">
<property name="ordersList">
<list>
<ref bean="orders"/>
</list>
</property>
</bean>
16. 小作业
把图书管理系统中的对象用Spring来管理;
Spring管理哪些对象?
- service
- dao
Spring的容器ApplicationContext单例的吗?---->监听器(ApplicationContext)
- 单例
service层和dao层的对象是单例的?
- 单例