企业营销型网站建设优惠,合肥有哪些公司是做网站的,查看网站流量的工具,平邑哪里有做网站的Spring是一个全面的全面的、企业应用开发一站式的解决方案#xff0c;贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。
1、Spring的核心组件
#xff08;1#xff09;数据层#xff1a; JDBC、ORM、OXM、JMS、Transations #xff08;2#x…Spring是一个全面的全面的、企业应用开发一站式的解决方案贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。
1、Spring的核心组件
1数据层 JDBC、ORM、OXM、JMS、Transations 2Web层 Web、Servlet、Portlet、Struts 3中间层 AOP、Aspects、Instrumentation 4核心容器 Beans、Core、Context、Expression Language 5测试层 Test
2、Spring IOC 原理
1概念 Spring通过一个配置文件描述Bean及Bean之间的依赖关系利用Java语言的反射功能实例化 Bean并建立Bean之间的依赖关系。Spring的IOC容器在完成这些底层工作的基础上还提供 了 Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。
2Spring容器高层视图
Spring启动时读取应用程序提供的Bean配置信息并在Spring容器中生成一份相应的Bean配置注册表根据这张注册表实例化Bean并将Bean实例存入Bean缓存池应用程序读取Bean缓存池中的Bean实例
3IOC容器实现
IOC容器依赖于BeanFactory是Spring框架的基础程序所以开发者操作的是ApplicationContext而非底层的BeanFactory。
Bean注册表
首先Spring配置文件中的每一个节点元素在Spring容器中都通过一个 BeanDefinition 对象表示它表述了 Bean 的配置信息而BeanDefinitionRegistry 接口提供了向容器手动注册 BeanDefinition 对象的方法。
获取Bean实例对象
BeanFactory 提供的最主要方法就是getBean(String beanName)方法调用该方法能从容器中返回一个特定名称的Bean。
访问容器中关于Bean的基本信息——ListableBeanFactory
BeanFactory 的子类 ListableBeanFactory提供了访问容器内关于Bean 的基本信息如Bean的个数获取某一类型Bean的配置名、查看容器中是否包含某一Bean等方法。
父子级容器——HierarchicalBeanFactory
父子级联IOC容器实现的接口是HierarchicalBeanFactory子容器可以通过接口方法访问父容器由此建立的IOC级联容器体系中子容器可以访问父容器而父容器无法访问子容器。
Spring利用父子级联容器实现了很多功能例如 SpringMVC中View层的Bean位于一个子容器中而Service层和Dao层的Bean位于父容器中这样View层的Bean就可以引用Service层和Dao层的Bean了
拓展接口 —— ConfigurableBeanFactory
这是一个BeanFactory子类系列十分重要的接口它增强了IOC的可定制性它定义了设置类加载器、属性编辑器、容器初始化后置处理器等方法
自动装配——AutowireCapableBeanFactory
这个接口定义了容器中的Bean按某种规则如按名字匹配、按类型匹配等进行自动装配的方法。
注册单例Bean——SingletonBeanRegistry
这个接口定义了允许在运行期间向容器注册单例Bean的方法。
对于单例Bean对象来说BeanFactory会缓存Bean实例所以第二次调用getBean()获取Bean对象时会直接从IOC容器的缓存中获取Bean实例。
Spring 在 DefaultSingletenBeanFactory 类中提供了用于缓存单例Bean 缓存器这个缓存器使用HashMap实现单例Bena以beanName作为key进行存储。
BeanFactory依赖日志框架
在初始化 BeanFactory 时必须提供一种日志框架例如使用Log4j这样启动Spring容器时才不会报错。
BeanFactory提供给开发者的操作类——ApplicationContext
ApplicationContext 继承于 HierarchicalBeanFactory 和 ListableBeanFactory 接口并由此拓展出其它功能接口
ClassPathXmlApplicationContext 默认从类路径加载配置文件FileSystemXmlApplicationContext 默认从文件系统中装载配置文件ApplicationEventPublisher 让容器拥有发布应用上下文事件的功能包括启动容器事件、关闭容器事件等MessageSource 为应用提供 il8n 国际化消息访问的功能ResourcePatternResolver 通过带前缀的Ant风格的资源文件路径装载Spring配置条件LifeCycle 这个接口是Spring 2.0 时加入的提供了start 和 stop 方法主要用来控制异步处理过程在具体使用中该接口会被ApplicaitonContext和Bean实例同时实现ApplicationContext 会将 start 和 stop 状态发布给所有实现了接口的Bean以达到管理和控制JMX、任务调度的目的ConfigurableApplicationContext 扩展了ApplicationContext主要是新增了两个方法refresh() 和 close()让ApplicationContext拥有了启动、刷新、关闭应用上下文的功能。
WebApplicationContext
WebApplicationContext是专门为Web应用准备的它允许从相对于Web根目录的路径中装载配置文件完成初始化工作从WebApplicationContext中可以获得ServletContext的引用整个Web应用上下文对象将作为属性放置到ServletContext 中以便Web应用环境可以访问Spring应用上下文。
4Spring Bean的作用域
Spring 3.0 定义了五种Bean的作用域单例、原型、请求、会话、全局会话
singleton单例模式多线程不安全 Spring IOC容器只存在一个共享的 Bean 实例无论有多少个 Bean 引用它始终指向同一个对象但这种模式在多线程环境下是不安全的。prototype原型模式 Spring 每一次尝试获取原型模式的Bean对象时容器都将创建一个新的Bean提供给Spring。request请求模式 一次HTTP请求Spring创建一次新的Bean提供使用其生命周期随请求状态的销毁而销毁。session会话模式 一次Http Session 中容器返回的是同一个实例当重新开启一次Http Session容器会重新创建一个Bean实例提供使用请求结束实例销毁。global session全局会话模式 在一个全局Http Session中容器返回同一个Bean实例仅在protlet context时使用。
5Spring Bean的生命周期
SpringBean的生命周期实例化 —— 属性赋值 —— 初始化 —— 销毁
实例化 实例化一个Bean也就是我们常说的new
属性赋值
IOC 依赖注入 按照Spring Context对Bean实例进行配置setBeanName的实现 若Bean实现了BeanNameAware接口调用setBeanName(String beanId)方法setBeanFactory的实现 若Bean实现了BeanFactoryAware接口调用setBeanFactory(BeanFacrtory beanFactory)方法setApplicationContext的实现 若Bean实现了ApplicationContextAware接口调用setApplicationContext(ApplicationContext applicationContext)方法可以实现设置BeanFactory方法并比BeanFactoryAware更加优秀postProcessBeforelnitialization的实现 若Bean实现了BeanPostProcessor接口将调用postProcessBeforelnitialization(Object obj, String s)方法BeanPostProcessor经常用于Bean内容的修改并且Bean初始化结束后也会调用这个方法也可以应用于内存或缓存技术。
初始化
init-method 若Bean在配置文件中定义了初始化方法则在初始化阶段会自动调用配置的初始化方法。postProcessAfterInitialization的实现 若Bean实现了BeanPostProcessor接口调用postProcessAfterInitialization(Object obj, String s)方法。
销毁
destroy 过期自动清理阶段 当Bean不再需要时会经历清理阶段若 Bean 实现了 DisposableBean 接口则调用destroy()方法进行销毁。destroy-method 自配置清理 若Bean的配置文件中设置了destroy方法时则自动调用自定义的destroy方法
6Spring 依赖注入的方式
Spring 提供的依赖注入的方式构造器注入、set方法注入、静态工厂注入、实例工厂注入
构造器注入案例
public CatDaoImpl(String message){this.message message;
}bean idCatDaoImpl classclass.CatDaoImplconstructor-arg valuemessage/constructor-arg
/beansetter方法注入
public class Id{private int id;public int getId(){return id;}public void setId(int id){this.id id;}
}bean idid classcom.Idproperty nameid value123/property
/bean静态工厂注入
// 对外提供的静态工厂
public class DaoFactory{public static final FactoryDao getStaticFactoryDaoImpl(){return new StaticFactoryDaoImpl;}
}//使用静态工厂的类
public class SpringAction{//注入对象private DaoFactory staticFactoryDao;//注入对象的set方法public void setStaticFactoryDao(FactoryDao staticFactoryDao){this.staticFactoryDao staticFactoryDao;}
}//给调用类注入静态工厂
bean namespringAction classcom.SpringActionproperty namestaticFactoryDao refstaticFatoryDao/property
/bean//给静态工厂中的成员注入
bean namestaticFatoryDao classcom.DaoFactory factory-methodgetStaticFactoryDaoImpl/bean实例工厂注入
//创建一个实例工厂
public class DaoFactory{public DaoFactory getFactoryDaoImpl(){return new FactoryDaoImpl(); }
}//调用类使用实例工厂
public class SpringAction{private DaoFactory daoFactory;public void setDaoFactory(DaoFactory daoFactory){this.daoFactory daoFactory;}
}//为调用类注入实例工厂Bean对象
bean namespringAction classSpringActionproperty namedaoFactory refdaoFactory/property
/bean//管理实例工厂先声明注入的类再配置实例工厂的成员
bean namedaoFactory classcom.DaoFactory/bean
bean namefactoryDao factory-beandaoFactory factory-methodgetFactoryDaoImpl/bean7自动装配的实现方式
Spring装配包括手动装配和自动装配手动装配是基于 xml 装配、构造方法、setter方法等。
自动装配一共有5种实现方式
no 默认不自动装配通过显式的 ref 属性进行装配byName 通过参数名自动装配Spring在配置文件中检测到Autowired属性被设置为byName容器自动按照beanName进行注入byType 通过参数类型自动装配Spring在配置文件中检测到Autowired属性被设置为byType容器自动按照type进行注入若有多个匹配对象则抛出错误constructor 类似于byType但必须提供构造器参数若没有确定参数的构造器参数类型则抛出异常autodetect 首先尝试使用 构造器参数 装配若无法工作则使用byType方式 3、Spring AOP 的原理
1概念 AOP是一种“横切”技术将多个类的公共模块抽取到一个模块中并将其命名为**“Aspect”**即切面。 2AOP的两个部分 核心关注点、横切关注点
核心关注点 业务处理的主要流程横切关注点 一切与业务代码无相关的代码
3AOP的应用场景
Authentication 权限Caching 缓存Context passing 内容传递Error handling 错误处理Lazy loading 懒加载Debugging 调试logging, tracing, profiling and monitoring 记录跟踪 优化 校准Performance optimization 性能优化Persistence 持久化Resource pooling 资源池Synchronization 同步Transactions 事务
4AOP的核心概念
切面Aspect 类是对物体特征的抽象切面是对横切关注点的抽象横切关注点 对哪些对象进行拦截、如何处理这些关注点都是横切关注点连接点JoinPoint 被拦截到的点因为Spirng只支持方法类型的连接点所以Spirng中连接点就是被拦截方法实际上连接点还可以是字段、构造方法切入点PointCut 对连接点进行拦截的定义通知Advice 所谓的通知就是拦截到连接点后要执行的代码分为前置、后置、异常、最终、环绕通知等类型目标对象 代理的目标对象织入weave 将切面应用到目标对象并导致代理对象创建的过程引入introduction 不修改代码的前提下引入可以在运行期为类动态地添加一些方法或字段
5AOP的代理方式
Spring 提供了两种AOP的代理方式JDK接口动态代理、CGLib动态代理
JDK接口动态代理
被代理类实现InvocationHandler通过实现该接口定义横切逻辑并通过反射机制调用目标类的代码动态地将横切逻辑和业务逻辑编织在一起代理类通过InvocationHandler接口动态创建一个实例生成目标类的代理对象
GCLib动态代理
GCLib的全称是Code Generation Library是一个高性能、高质量的代码生成类库可以在运行期间动态扩展Java类和实现Java接口CGLib封装了ASM可以在运行期间生成新的class对比JDK动态代理CGLib可以动态代理未实现接口的类。
6AOP的实现原理
Aspect
public class TransactionDemo {Pointcut(valueexecution(* com.yangxin.core.service.*.*.*(..))) public void point(){}Before(valuepoint())public void before(){System.out.println(transaction begin);}AfterReturning(value point())public void after(){System.out.println(transaction commit);}Around(point())public void around(ProceedingJoinPoint joinPoint) throws Throwable{ System.out.println(transaction begin);joinPoint.proceed();System.out.println(transaction commit);}
}4、Spring MVC 的原理
MVC指的是Modal模型View视图Controller控制器Spring MVC框架是围绕 DispatcherServlet 而设计的这个Servlet会将请求分发到各个控制器并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等甚至还能支持文件上传。
1浏览器请求的全过程
浏览器发送HTTP请求DispatcherServlet接收DispatcherServlet轮询处理器通过HandlerMapping进行查找适用的Controller当HandlerMapping查找到处理器后DispatcherServlet调用处理器将请求发送给ControllerController调用Service层业务逻辑获取返回值后分发到ModalAndView对象DispatcherServlet监听ModalAndView响应结果DispatcherServlet得到结果后分发给Model对象并轮询视图映射ViewResolver查找到指定的视图Modal将结果反应到视图View向浏览器发送响应体
2MVC常用注解
组件注解 Controller、RestController、Component、Repository、Service 请求注解 RequestMapping、Autowired、PathVariable、RequestParam、RequestHeader 5、MyBatis缓存
MyBatis拥有两级缓存默认情况下开启一级缓存二级缓存由开发者手动开启。
一级缓存是会话级别的缓存当同一会话调用同一个SQL时优先从缓存中读取数据。 二级缓存是映射级别的缓存不同的SQL会话可以共享该缓存
1一级缓存的原理
当用户线程第一次发出查询sqlsql的查询结果会写入到sqlSession的一级缓存中缓存使用的是Map结构其中key mapperID offset limit SQL 所有入参value 用户信息当同一个sqlSession再次发出同一个sql请求就从缓存中取出数据若两次查询中间发生更新操作则本sqlSession中的一级缓存区域全部清空所以第二次请求会从数据库中查询并写入到新的缓存中去。
2二级缓存的原理
二级缓存的范围是mapper同命名空间的mappermapper以命名空间为单位创建缓存数据结构结构是 map通过 CacheExecutor 实现的。
CacheExecutor是Executor的代理对象所有的查询操作在CacheExecutor都会先查询缓存再查询数据库。
3如何配置二级缓存
MyBatis 全局配置中启用二级缓存配置对应的mapper配置cache节点对应的select查询节点添加useCachetrue