当前位置: 首页 > news >正文

做外贸都用什么网站做外销网站

做外贸都用什么网站,做外销网站,免费自助建网站,上海注册外贸公司作者 | 夏目blog.csdn.net/wuzhiwei549/article/details/122324261Sping原理Spring是一个轻量级Java开发框架#xff0c;最早有Rod Johnson创建#xff0c;目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack#xff0… 作者 | 夏目blog.csdn.net/wuzhiwei549/article/details/122324261Sping原理Spring是一个轻量级Java开发框架最早有Rod Johnson创建目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack一站式轻量级开源框架为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构因此Java开发者可以专注于应用程序的开发。Spring是一个全面的、企业应用开发一站式的解决方案贯穿表现层、业务层、持久层。但是它仍然可以和其他的框架无缝整合。Spring 特点轻量级 组件大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1M多的JAR文件中发布并且Spring所需的处理开销也是微不足道的。此外Spring是非侵入式典型案例Spring应用中的对象不依赖于Spring特定的类控制反转 Spring通过控制反转IOC技术实现解耦。一个对象依赖的其他对象会通过被动的方式传递进来而不需要对象自己创建或者查找依赖。面向切面 支持切面AOP编程并且吧应用业务逻辑和系统服务区分开。容器 Spring包含并管理应用对象的配置和生命周期在这个意义上它是一种容器。可以配置每个bean如何被创建、销毁bean的作用范围是单例还是每次都生成一个新的实例以及他们是如何相互关联。框架集合 将简单的组件配置组合成为复杂的框架应用对象被申明式组合提供许多基础功能事务管理、持久化框架继承提供应用逻辑开发接口Spring 框架优缺点优点方便解耦简化开发Spring就是一个大工厂可以将所有对象的创建和依赖关系的维护交给Spring管理。AOP编程的支持Spring提供面向切面编程可以方便的实现对程序进行权限拦截、运行监控等功能。声明式事务的支持只需要通过配置就可以完成对事务的管理而无需手动编程。方便程序的测试Spring对Junit4支持可以通过注解方便的测试Spring程序。方便集成各种优秀框架Spring不排斥各种优秀的开源框架其内部提供了对各种优秀框架的直接支持如Struts、Hibernate、MyBatis等。降低JavaEE API的使用难度Spring对JavaEE开发中非常难用的一些APIJDBC、JavaMail、远程调用等都提供了封装使这些API应用难度大大降低。缺点Spring依赖反射反射影响性能使用门槛升高入门Spring需要较长时间Spring 框架中都用到了哪些设计模式Spring 框架中使用到了大量的设计模式下面列举了比较有代表性的代理模式—在 AOP 和 remoting 中被用的比较多。单例模式—在 spring 配置文件中定义的 bean 默认为单例模式。模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTempl ate。前端控制器—Spring 提供了 DispatcherServlet 来对请求进行分发。视图帮助(View Helper )—Spring 提供了一系列的 JSP 标签高效宏来辅助将分散的代码整合在视图里。依赖注入—贯穿于 BeanFactory / ApplicationContext 接口的核心理念。工厂模式—BeanFactory 用来创建对象的实例Spring核心组件Spring 总共大约有 20 个模块 由 1300 多个不同的文件构成。而这些组件被分别整合在核心容器Core Container 、 AOPAspect Oriented Programming和设备支持Instrmentation 、数据访问与集成Data Access/Integeration 、 Web、 消息Messaging 、 Test等 6 个模块中。以下是 Spring 5 的模块结构图spring core提供了框架的基本组成部分包括控制反转Inversion of ControlIOC和依赖注入Dependency InjectionDI功能。spring beans提供了BeanFactory是工厂模式的一个经典实现Spring将管理对象称为Bean。spring context构建于 core 封装包基础上的 context 封装包提供了一种框架式的对象访问方法。spring jdbc提供了一个JDBC的抽象层消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析 用于简化JDBC。spring aop提供了面向切面的编程实现让你可以自定义拦截器、切点等。spring Web提供了针对 Web 开发的集成特性例如文件上传利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。spring test主要为测试提供支持的支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。Spring 控制反转IOC控制反转IOC概念控制反转即IOC (Inversion of Control)它把传统上由程序代码直接操控的对象的调用权交给容器通过容器来实现对象组件的装配和管理。Spring 通过一个配置文件描述 Bean 及 Bean 之间的依赖关系利用 Java 语言的反射功能(依赖注入DI)实例化 Bean 并建立 Bean 之间的依赖关系。Spring 的 IoC 容器在完成这些底层工作的基础上还提供 了 Bean 实例缓存、生命周期管理、 Bean 实例代理、事件发布、资源装载等高级服务。Spring 容器高层视图Spring 启动时读取应用程序提供的 Bean 配置信息并在 Spring 容器中生成一份相应的 Bean 配置注册表然后根据这张注册表实例化 Bean装配好 Bean 之间的依赖关系为上层应用提供准备就绪的运行环境。其中 Bean 缓存池为 HashMap 实现IOC 容器实现BeanFactory-框架基础设施BeanFactory 是 Spring 框架的基础设施面向 Spring 本身ApplicationContext 面向使用Spring 框架的开发者几乎所有的应用场合我们都直接使用 ApplicationContext 而非底层的 BeanFactory。BeanDefinitionRegistry 注册表Spring 配置文件中每一个节点元素在 Spring 容器里都通过一个 BeanDefinition 对象表示它描述了 Bean 的配置信息。而 BeanDefinitionRegistry 接口提供了向容器手工注册BeanDefinition 对象的方法。BeanFactory 顶层接口位于类结构树的顶端 它最主要的方法就是 getBean(String beanName)该方法从容器中返回特定名称的 BeanBeanFactory 的功能通过其他的接口得到不断扩展ListableBeanFactory该接口定义了访问容器中 Bean 基本信息的若干方法如查看 Bean 的个数、获取某一类型Bean 的配置名、查看容器中是否包括某一 Bean 等方法HierarchicalBeanFactory 父子级父子级联 IoC 容器的接口子容器可以通过接口方法访问父容器通过HierarchicalBeanFactory 接口 Spring 的 IoC 容器可以建立父子层级关联的容器体系子容器可以访问父容器中的 Bean但父容器不能访问子容器的 Bean。Spring 使用父子容器实现了很多功能比如在 Spring MVC 中展现层 Bean 位于一个子容器中而业务层和持久层的 Bean 位于父容器中。这样展现层 Bean 就可以引用业务层和持久层的 Bean而业务层和持久层的 Bean 则看不到展现层的 Bean。ConfigurableBeanFactory是一个重要的接口增强了 IoC 容器的可定制性它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法AutowireCapableBeanFactory 自动装配定义了将容器中的 Bean 按某种规则如按名字匹配、按类型匹配等进行自动装配的方法SingletonBeanRegistry 运行期间注册单例 Bean定义了允许在运行期间向容器注册单实例 Bean 的方法对于单实例 singleton的 Bean 来说BeanFactory 会缓存 Bean 实例所以第二次使用 getBean() 获取 Bean 时将直接从IoC 容器的缓存中获取 Bean 实例。Spring 在 DefaultSingletonBeanRegistry 类中提供了一个用于缓存单实例 Bean 的缓存器它是一个用 HashMap 实现的缓存器单实例的 Bean 以beanName 为键保存在这个 HashMap 中。依赖日志框架在初始化 BeanFactory 时必须为其提供一种日志框架比如使用 Log4J 即在类路径下提供 Log4J 配置文件这样启动 Spring 容器才不会报错。ApplicationContext 面向开发应用ApplicationContext 由 BeanFactory 派生而来提供了更多面向实际应用的功能。ApplicationContext 继承了 HierarchicalBeanFactory 和 ListableBeanFactory 接口在此基础上还通过多个其他的接口扩展了 BeanFactory 的功能ClassPathXmlApplicationContext默认从类路径加载配置文件FileSystemXmlApplicationContext默认从文件系统中装载配置文件ApplicationEventPublisher让容器拥有发布应用上下文事件的功能包括容器启动事件、关闭事件等。MessageSource为应用提供 i18n 国际化消息访问的功能ResourcePatternResolver 所有 ApplicationContext 实现类都实现了类似于PathMatchingResourcePatternResolver通过带前缀的 Ant 风格的资源文件路径装载 Spring 的配置文件。LifeCycle该接口是 Spring 2.0 加入的该接口提供了 start()和 stop()两个方法主要用于控制异步处理过程。在具体使用时该接口同时被 ApplicationContext 实现及具体Bean 实现 ApplicationContext 会将 start/stop 的信息传递给容器中所有实现了该接口的 Bean以达到管理和控制 JMX、任务调度等目的。ConfigurableApplicationContext 扩展于 ApplicationContext它新增加了两个主要的方法refresh()和 close()让 ApplicationContext 具有启动、刷新和关闭应用上下文的能力。在应用上下文关闭的情况下调用 refresh()即可启动应用上下文在已经启动的状态下调用 refresh()则清除缓存并重新装载配置信息而调用 close()则可关闭应用上下文。BeanFactory 和 ApplicationContext有什么区别BeanFactory和ApplicationContext是Spring的两大核心接口都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。依赖关系BeanFactory是Spring里面最底层的接口包含了各种Bean的定义读取bean配置文档管理bean的加载、实例化控制bean的生命周期维护bean之间的依赖关系。ApplicationContext接口作为BeanFactory的派生除了提供BeanFactory所具有的功能外还提供了更完整的框架功能继承MessageSource因此支持国际化。统一的资源文件访问方式。提供在监听器中注册bean的事件。同时加载多个配置文件。载入多个有继承关系上下文 使得每一个上下文都专注于一个特定的层次比如应用的web层。加载方式BeanFactroy采用的是延迟加载形式来注入Bean的即只有在使用到某个Bean时(调getBean())才对该Bean进行加载实例化。这样我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入BeanFacotry加载后直至第一次使用调用getBean方法才会抛出异常。ApplicationContext它是在容器启动时一次性创建了所有的Bean。这样在容器启动时我们就可以发现Spring中存在的配置错误这样有利于检查所依赖属性是否注入。ApplicationContext启动后预载入所有的单实例Bean通过预载入单实例bean ,确保当你需要的时候你就不用等待因为它们已经创建好了。相对于基本的BeanFactoryApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时程序启动较慢。创建方式BeanFactory通常以编程的方式被创建ApplicationContext还能以声明的方式创建如使用ContextLoader。注册方式BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用但两者之间的区别是BeanFactory需要手动注册而ApplicationContext则是自动注册。ApplicationContext通常的实现FileSystemXmlApplicationContext 此容器从一个XML文件中加载beans的定义XML Bean 配置文件的全路径名必须提供给它的构造函数。ClassPathXmlApplicationContext此容器也从一个XML文件中加载beans的定义这里你需要正确设置classpath因为这个容器将在classpath里找bean配置。WebXmlApplicationContext此容器加载一个XML文件此文件定义了一个WEB应用的所有bean。Spring的依赖注入其主要实现方式有两种依赖注入和依赖查找。依赖注入 相对于IoC而言依赖注入(DI)更加准确地描述了IoC的设计理念。所谓依赖注入Dependency Injection即组件之间的依赖关系由容器在应用系统运行期来决定也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。组件不做定位查询只提供普通的Java方法让容器去决定依赖关系。依赖注入的基本原则应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由IoC容器负责“查找资源”的逻辑应该从应用组件的代码中抽取出来交给IoC容器负责。容器全权负责组件的装配它会把符合依赖关系的对象通过属性JavaBean中的setter或者是构造器传递给需要的对象。依赖注入优势依赖注入之所以更流行是因为它是一种更可取的方式让容器全权负责依赖查询受管组件只需要暴露JavaBean的setter方法或者带参数的构造器或者接口使容器可以在初始化时组装对象的依赖关系。其与依赖查找方式相比主要优势为查找定位操作与应用代码完全无关不依赖于容器的API可以很容易地在任何容器以外使用应用对象不需要特殊的接口绝大多数对象可以做到完全不必依赖容器依赖注入实现方式依赖注入是时下最流行的IoC实现方式依赖注入分为接口注入Interface InjectionSetter方法注入Setter Injection和构造器注入Constructor Injection三种方式。其中接口注入由于在灵活性和易用性比较差现在从Spring4开始已被废弃。构造器依赖注入构造器依赖注入通过容器触发一个类的构造器来实现的该类有一系列参数每个参数代表一个对其他类的依赖Setter方法注入Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后调用该bean的setter方法即实现了基于setter的依赖注入构造器依赖注入和 Setter方法注入的区别两种依赖方式都可以使用构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖setter方法实现可选依赖。WebApplication 体系架构WebApplicationContext 是专门为 Web 应用准备的它允许从相对于 Web 根目录的路径中装载配置文件完成初始化工作。从 WebApplicationContext 中可以获得ServletContext 的引用整个 Web 应用上下文对象将作为属性放置到 ServletContext 中以便 Web 应用环境可以访问 Spring 应用上下文。Spring Bean 定义一个Spring Bean 的定义包含容器必知的所有配置元数据包括如何创建一个bean它的生命周期详情及它的依赖。Spring元数据配置方式XML配置文件基于注解的配置基于java的配置Spring Bean 作用域Spring 3 中为 Bean 定义了 5 中作用域分别为 singleton单例、prototype原型、request、session 和 global session5 种作用域说明如下singleton单例模式多线程下不安全。Spring IoC 容器中只会存在一个共享的 Bean 实例无论有多少个Bean 引用它始终指向同一对象。该模式在多线程下是不安全的。Singleton 作用域是Spring 中的缺省作用域也可以显示的将 Bean 定义为 singleton 模式配置为prototype:原型模式每次使用时创建。每次通过 Spring 容器获取 prototype 定义的 bean 时容器都将创建一个新的 Bean 实例每个 Bean 实例都有自己的属性和状态而 singleton 全局只有一个对象。根据经验对有状态的bean使用prototype作用域而对无状态的bean使用singleton 作用域。Request一次 request 一个实例。在一次 Http 请求中容器会返回该 Bean 的同一实例。而对不同的 Http 请求则会产生新的 Bean而且该 bean 仅在当前 Http Request 内有效,当前 Http 请求结束该 bean实例也将会被销毁。session在一次 Http Session 中容器会返回该 Bean 的同一实例。而对不同的 Session 请求则会创建新的实例该 bean 实例仅在当前 Session 内有效。同 Http 请求相同每一次session 请求创建新的实例而不同的实例之间不共享属性且实例仅在自己的 session 请求内有效请求结束则实例将被销毁。global Session在一个全局的 Http Session 中容器会返回该 Bean 的同一个实例仅在使用 portlet context 时有效。Spring处理线程并发问题在一般情况下只有无状态的Bean才可以在多线程环境下共享在Spring中绝大部分Bean都可以声明为singleton作用域因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理解决线程安全问题。ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式仅提供一份变量不同的线程在访问前需要获取锁没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式。ThreadLocal会为每一个线程提供一个独立的变量副本从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象在编写多线程代码时可以把不安全的变量封装进ThreadLocal。Spring Bean 生命周期实例化实例化一个 Bean也就是我们常说的 new。IOC 依赖注入按照 Spring 上下文对实例化的 Bean 进行配置也就是 IOC 注入。setBeanName 实现如果这个 Bean 已经实现了 BeanNameAware 接口会调用它实现的 setBeanName(String)方法此处传递的就是 Spring 配置文件中 Bean 的 id 值BeanFactoryAware 实现如果这个 Bean 已经实现了 BeanFactoryAware 接口会调用它实现的 setBeanFactorysetBeanFactory(BeanFactory)传递的是 Spring 工厂自身可以用这个方式来获取其它 Bean只需在 Spring 配置文件中配置一个普通的 Bean 就可以。ApplicationContextAware 实现如果这个 Bean 已经实现了 ApplicationContextAware 接口会调用setApplicationContext(ApplicationContext)方法传入 Spring 上下文同样这个方式也可以实现步骤 4 的内容但比 4 更好因为 ApplicationContext 是 BeanFactory 的子接口有更多的实现方法postProcessBeforeInitialization 接口实现-初始化预处理如果这个 Bean 关联了 BeanPostProcessor 接口将会调用postProcessBeforeInitialization(Object obj, String s)方法BeanPostProcessor 经常被用作是 Bean 内容的更改并且由于这个是在 Bean 初始化结束时调用那个的方法也可以被应用于内存或缓存技术。init-method如果 Bean 在 Spring 配置文件中配置了 init-method 属性会自动调用其配置的初始化方法。postProcessAfterInitialization如果这个 Bean 关联了 BeanPostProcessor 接口将会调用postProcessAfterInitialization(Object obj, String s)方法。注以上工作完成以后就可以应用这个 Bean 了那这个 Bean 是一个 Singleton 的所以一般情况下我们调用同一个 id 的 Bean 会是在内容地址相同的实例当然在 Spring 配置文件中也可以配置非 Singleton。Destroy 过期自动清理阶段当 Bean 不再需要时会经过清理阶段如果 Bean 实现了 DisposableBean 这个接口会调用那个其实现的 destroy()方法destroy-method 自配置清理最后如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性会自动调用其配置的销毁方法。bean生命周期方法bean 标签有两个重要的属性init-method 和 destroy-method。用它们你可以自己定制初始化和注销方法。它们也有相应的注解PostConstruct 和PreDestroy。bean id class init-method初始化方法 destroy-method销毁方法什么是Spring的内部bean什么是Spring inner beans在Spring框架中当一个bean仅被用作另一个bean的属性时它能被声明为一个内部bean。内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现内部bean通常是匿名的它们的Scope一般是prototype。Spring 依赖注入四种方式构造器注入/*带参数方便利用构造器进行注入*/public CatDaoImpl(String message){this. message  message;}bean idCatDaoImpl classcom.CatDaoImplconstructor-arg value message /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.id  property nameid value123/property /bean静态工厂注入静态工厂顾名思义就是通过调用静态工厂的方法来获取自己需要的对象为了让 spring 管理所有对象我们不能直接通过工程类.静态方法()来获取对象而是依然通过 spring 注入的形式获取public class DaoFactory { //静态工厂public static final FactoryDao getStaticFactoryDaoImpl(){return new StaticFacotryDaoImpl();}}public class SpringAction {private FactoryDao staticFactoryDao; //注入对象//注入对象的 set 方法public void setStaticFactoryDao(FactoryDao staticFactoryDao) {this.staticFactoryDao  staticFactoryDao;}}!--factory-methodgetStaticFactoryDaoImpl指定调用哪个工厂方法--bean namespringAction class SpringAction !--使用静态工厂的方法注入对象,对应下面的配置文件--property namestaticFactoryDao refstaticFactoryDao/property/bean!--此处获取对象的方式是从工厂类中获取静态方法--bean namestaticFactoryDao classDaoFactoryfactory-methodgetStaticFactoryDaoImpl/bean实例工厂实例工厂的意思是获取对象实例的方法不是静态的所以你需要首先 new 工厂类再调用普通的实例方法public class DaoFactory { //实例工厂public FactoryDao getFactoryDaoImpl(){return new FactoryDaoImpl();}}public class SpringAction {private FactoryDao factoryDao; //注入对象public void setFactoryDao(FactoryDao factoryDao) {this.factoryDao  factoryDao;}}bean namespringAction classSpringAction!--使用实例工厂的方法注入对象,对应下面的配置文件--property namefactoryDao reffactoryDao/property/bean!--此处获取对象的方式是从工厂类中获取实例方法--bean namedaoFactory classcom.DaoFactory/beanbean namefactoryDao factory-beandaoFactoryfactory-methodgetFactoryDaoImpl/bean5 种不同方式的自动装配Spring 装配包括手动装配和自动装配手动装配是有基于 xml 装配、构造方法、setter 方法等自动装配有五种自动装配的方式可以用来指导 Spring 容器用自动装配方式来进行依赖注入。no默认的方式是不进行自动装配通过显式设置 ref 属性来进行装配。byName通过参数名 自动装配Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byName之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。byType通过参数类型自动装配Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byType之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多个 bean 符合条件则抛出错误。constructor这个方式类似于 byType 但是要提供给构造器参数如果没有确定的带参数的构造器参数类型将会抛出异常。autodetect首先尝试使用 constructor 来自动装配如果无法工作则使用 byType 方式。Spring 中注入一个 Java CollectionSpring 提供了以下四种集合类的配置元素list : 该标签用来装配可重复的 list 值。set : 该标签用来装配没有重复的 set 值。map: 该标签可用来注入键和值可以为任何类型的键值对。props : 该标签支持注入键和值都是字符串类型的键值对。beans !-- Definition for javaCollection -- bean idjavaCollection classcom.howtodoinjava.JavaCollection !-- java.util.List -- property namecustomList list valueINDIA/value valuePakistan/value valueUSA/value valueUK/value /list /property !-- java.util.Set -- property namecustomSet set valueINDIA/value valuePakistan/value valueUSA/value valueUK/value /set /property !-- java.util.Map -- property namecustomMap map entry key1 valueINDIA/ entry key2 valuePakistan/ entry key3 valueUSA/ entry key4 valueUK/ /map /property !-- java.util.Properties -- property namecustomProperies props prop keyadminadminnospam.com/prop prop keysupportsupportnospam.com/prop /props /property /bean  /beans使用Autowired注解自动装配的过程在使用Autowired注解之前需要在Spring配置文件进行配置context:annotation-config /。在启动spring IoC时容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器当容器扫描到Autowied、Resource或Inject时就会在IoC容器自动查找需要的bean并装配给该对象的属性。在使用Autowired时首先在容器中查询对应类型的bean如果查询结果刚好为一个就将该bean装配给Autowired指定的数据如果查询的结果不止一个那么Autowired会根据名称来查找如果上述查找的结果为空那么会抛出异常。解决方法时使用requiredfalse。Spring AOPAOP原理OOP(Object-Oriented Programming)面向对象编程允许开发者定义纵向的关系但并适用于定义横向的关系导致了大量代码的重复而不利于各个模块的重用。AOP(Aspect-Oriented Programming)一般称为面向切面编程作为面向对象的一种补充用于将那些与业务无关但却对多个对象产生影响的公共行为和逻辑抽取并封装为一个可重用的模块这个模块被命名为“切面”Aspect减少系统中的重复代码降低了模块间的耦合度同时提高了系统的可维护性。AOP 主要应用场景有Authentication 权限Caching 缓存Context passing 内容传递Error handling 错误处理Lazy loading 懒加载Debugging 调试logging, tracing, profiling and monitoring 记录跟踪 优化 校准Performance optimization 性能优化Persistence 持久化Resource pooling 资源池Synchronization 同步Transactions 事务AOP 核心概念切面aspect类是对物体特征的抽象切面就是对横切关注点的抽象横切关注点对哪些方法进行拦截拦截后怎么处理这些关注点称之为横切关注点连接点joinpoint被拦截到的点因为 Spring 只支持方法类型的连接点所以在 Spring中连接点指的就是被拦截到的方法实际上连接点还可以是字段或者构造器切入点pointcut对连接点进行拦截的定义通知advice所谓通知指的就是指拦截到连接点之后要执行的代码通知分为前置、后置、异常、最终、环绕通知五类目标对象代理的目标对象织入weave将切面应用到目标对象并导致代理对象创建的过程编译期切面在目标类编译时被织入。AspectJ的织入编译器是以这种方式织入切面的类加载期切面在目标类加载到JVM时被织入。需要特殊的类加载器它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5的加载时织入就支持以这种方式织入切面运行期切面在应用运行的某个时刻被织入。一般情况下在织入切面时AOP容器会为目标对象动态地创建一个代理对象。SpringAOP就是以这种方式织入切面。引入introduction在不修改代码的前提下引入可以在运行期为类动态地添加一些方法或字段Spring 中的代理将 Advice 应用于目标对象后创建的对象称为代理。在客户端对象的情况下目标对象和代理对象是相同的。Advice Target Object ProxyAOP 实现方式AOP实现的关键在于代理模式AOP代理主要分为静态代理和动态代理。AspectJ 静态代理的增强所谓静态代理就是AOP框架会在编译阶段生成AOP代理类因此也称为编译时增强他会在编译阶段将AspectJ(切面)织入到Java字节码中运行的时候就是增强之后的AOP对象。Spring AOP使用的动态代理所谓的动态代理就是说AOP框架不会去修改字节码而是每次运行时在内存中临时为方法生成一个AOP对象这个AOP对象包含了目标对象的全部方法并且在特定的切点做了增强处理并回调原对象的方法。AOP 两种代理方式Spring 提供了两种方式来生成代理对象: JDK Proxy 和 Cglib具体使用哪种方式生成由AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。默认的策略是如果目标类是接口则使用 JDK 动态代理技术否则使用 Cglib 来生成代理。JDK 动态接口代理JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类Proxy 和 InvocationHandler。InvocationHandler是一个接口通过实现该接口定义横切逻辑并通过反射机制调用目标类的代码动态将横切逻辑和业务逻辑编制在一起。Proxy 利用 InvocationHandler 动态创建一个符合某一接口的实例生成目标类的代理对象。CGLib 动态代理CGLib 全称为 Code Generation Library是一个强大的高性能高质量的代码生成类库可以在运行期扩展 Java 类与实现 Java 接口CGLib 封装了 asm可以再运行期动态生成新的 class。和 JDK 动态代理相比较JDK 创建代理有一个限制就是只能为接口创建代理实例而对于没有通过接口定义业务方法的类则可以通过 CGLib 创建动态代理。实现原理Aspectpublic 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);} }Spring在运行时通知对象通过在代理类中包裹切面Spring在运行期把切面织入到Spring管理的bean中。代理封装了目标类并拦截被通知方法的调用再把调用转发给真正的目标bean。当代理拦截到方法调用时在调用目标bean方法之前会执行切面逻辑。直到应用需要被代理的bean时Spring才创建代理对象。如果使用的是ApplicationContext的话在ApplicationContext从BeanFactory中加载所有bean的时候Spring才会创建被代理的对象。因为Spring运行时才创建代理对象所以我们不需要特殊的编译器来织入SpringAOP的切面。Spring只支持方法级别的连接点因为Spring基于动态代理所以Spring只支持方法连接点。Spring缺少对字段连接点的支持而且它不支持构造器连接点。方法之外的连接点拦截功能我们可以利用Aspect来补充。在Spring AOP 中关注点和横切关注的区别是什么在 spring aop 中 concern 和 cross-cutting concern 的不同之处关注点concern是应用中一个模块的行为一个关注点可能会被定义成一个我们想实现的一个功能。横切关注点cross-cutting concern是一个关注点此关注点是整个应用都会使用的功能并影响整个应用比如日志安全和数据传输几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。Spring通知类型在AOP术语中切面的工作被称为通知实际上是程序执行时要通过SpringAOP框架触发的代码段。Spring切面可以应用5种类型的通知前置通知Before在目标方法被调用之前调用通知功能后置通知After在目标方法完成之后调用通知此时不会关心方法的输出是什么返回通知After-returning 在目标方法成功执行之后调用通知异常通知After-throwing在目标方法抛出异常后调用通知环绕通知Around通知包裹了被通知的方法在被通知的方法调用之前和调用之后执行自定义的行为。同一个aspect不同advice的执行顺序没有异常情况下的执行顺序around before advicebefore advicetarget method 执行around after adviceafter adviceafterReturning有异常情况下的执行顺序around before advicebefore advicetarget method 执行around after adviceafter adviceafterThrowing:异常发生java.lang.RuntimeException: 异常发生Spring MVCSpring MVC 原理Spring 的模型-视图-控制器MVC框架是围绕一个 DispatcherServlet 来设计的这个 Servlet会把请求分发给各个处理器并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等甚至还能支持文件上传。Http 请求到 DispatcherServlet(1) 客户端请求提交到 DispatcherServlet。HandlerMapping 寻找处理器(2) 由 DispatcherServlet 控制器查询一个或多个 HandlerMapping找到处理请求的Controller。调用处理器 Controller(3) DispatcherServlet 将请求提交到 Controller。Controller 调用业务逻辑处理后返回 ModelAndView(4)(5)调用业务处理和返回结果Controller 调用业务逻辑处理后返回 ModelAndView。DispatcherServlet 查询 ModelAndView(6)(7)处理视图映射并返回模型DispatcherServlet 查询一个或多个 ViewResoler 视图解析器找到 ModelAndView 指定的视图。ModelAndView 反馈浏览器 HTTP(8) Http 响应视图负责将结果显示到客户端。Spring DATASpring ORM理解Spring 通过提供ORM模块支持我们在直接JDBC之上使用一个对象/关系映射映射(ORM)工具Spring 支持集成主流的ORM框架如HiberateJDO和 iBATISJPATopLinkJDOOJB 。Spring的事务管理同样支持以上所有ORM框架及JDBC。解释JDBC抽象和DAO模块通过使用JDBC抽象和DAO模块保证数据库代码的简洁并能避免数据库资源错误关闭导致的问题它在各种不同的数据库的错误信息之上提供了一个统一的异常访问层。它还利用Spring的AOP 模块给Spring应用中的对象提供事务管理服务。Spring DAO 的支持Spring DAO数据访问对象 使得 JDBCHibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时无需考虑捕获每种技术不同的异常。Spring JDBC APIJdbcTemplateSimpleJdbcTemplateNamedParameterJdbcTemplateSimpleJdbcInsertSimpleJdbcCallJdbcTemplate是什么JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象执行写好的或可调用的数据库操作语句提供自定义的数据错误处理。使用Spring通过什么方式访问Hibernate有两种方式访问Hibernate使用 Hibernate 模板和回调进行控制反转扩展 HibernateDAOSupport 并应用 AOP 拦截器节点Spring 支持的 ORMSpring 支持以下 ORMHibernateiBatisJPA (Java Persistence API)TopLinkJDO (Java Data Objects)OJB如何通过 HibernateDaoSupport 将 Spring 和 Hibernate 结合起来用 Spring 的 SessionFactory 调用 LocalSessionFactory。集成过程分三步配置 the Hibernate SessionFactory继承 HibernateDaoSupport实现一个 DAO 在 AOP 支持的事务中装配Spring 支持的事务管理类型Spring 支持两种类型的事务管理编程式事务管理这意味你通过编程的方式管理事务给你带来极大的灵活性但是 难维护。声明式事务管理这意味着你可以将业务代码和事务管理分离你只需用注解和 XML 配置来管理事务。Spring 框架的事务管理有哪些优点它为不同的事务 API 如 JTAJDBCHibernateJPA 和 JDO提供一个不变 的编程模式。它为编程式事务管理提供了一套简单的 API 而不是一些复杂的事务 API 如 它支持声明式事务管理。它和 Spring 各种数据访问抽象层很好得集成。你更倾向用那种事务管理类型大多数 Spring 框架的用户选择声明式事务管理因为它对应用代码的影响最小因 此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理 虽然比编程式事务管理这种方式允许你通过代码控制事务少了一点灵活性。Spring常用注解声明bean的注解Component 组件没有明确的角色Service 在业务逻辑层使用Repository 在数据访问层使用Controller 在展现层使用控制层的声明RestController Controller和ResponseBody组合控制层的声明注入bean的注解AutowiredSpring自带的注解通过AutowiredAnnotationBeanPostProcessor 类实现的依赖注入作用在CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE。默认是根据类型byType 进行自动装配的。如果有多个类型一样的Bean候选者需要指定按照名称byName 进行装配则需要配合Qualifier。指定名称后如果Spring IOC容器中没有对应的组件bean抛出NoSuchBeanDefinitionException。也可以将Autowired中required配置为false如果配置为false之后当没有找到相应bean的时候系统不会抛异常InjectJSR330 (Dependency Injection for Java)中的规范需要导入javax.inject.Inject jar包 才能实现注入 作用CONSTRUCTOR、METHOD、FIELD上根据类型进行自动装配的如果需要按名称进行装配则需要配合NamedResourceJSR250规范的实现在javax.annotation包下作用TYPE、FIELD、METHOD上。默认根据属性名称进行自动装配的如果有多个类型一样的Bean候选者则可以通过name进行指定进行注入java配置类相关注解Configuration 声明当前类为配置类相当于xml形式的Spring配置类上声明当前类为配置类其中内部组合了Component注解表明这个类是一个bean类上Bean 注解在方法上声明当前方法的返回值为一个bean替代xml中的方式方法上ComponentScan 用于对Component进行扫描相当于xml中的类上WishlyConfiguration 为Configuration与ComponentScan的组合注解可以替代这两个注解切面AOP相关注解Spring支持AspectJ的注解式切面编程Aspect声明一个切面类上使用After、Before、Around定义建言advice可直接将拦截规则切点作为参数。After 在方法执行之后执行方法上Before 在方法执行之前执行方法上Around 在方法执行之前与之后执行方法上PointCut 声明切点在java配置类中使用EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持类上Bean的属性支持Scope 设置Spring容器如何新建Bean实例方法上得有Bean其设置类型包括Singleton单例,一个Spring容器中只有一个bean实例默认模式Protetype每次调用新建一个beanRequestweb项目中给每个http request新建一个beanSession web项目中给每个http session新建一个beanGlobalSession给每一个 global http session新建一个Bean实例StepScope在Spring Batch中还有涉及(Spring Batch 之 背景框架简介_vincent-CSDN博客)PostConstruct 由JSR-250提供在构造函数执行完之后执行等价于xml配置文件中bean的initMethodPreDestory 由JSR-250提供在Bean销毁之前执行等价于xml配置文件中bean的destroyMethodValue注解为属性注入值,支持如下方式的注入注入普通字符注入操作系统属性注入表达式结果注入其它bean属性注入文件资源注入网站资源注入配置文件PropertySource 加载配置文件(类上)还需配置一个PropertySourcesPlaceholderConfigurer的bean。环境切换Profile 通过设定Environment的ActiveProfiles来设定当前context需要使用的配置环境。类或方法上ConditionalSpring4中可以使用此注解定义条件话的bean通过实现Condition接口并重写matches方法从而决定该bean是否被实例化。方法上异步相关EnableAsync配置类中通过此注解开启对异步任务的支持叙事性AsyncConfigurer接口类上Async在实际执行的bean方法使用该注解来申明其是一个异步任务方法上或类上所有的方法都将异步需要EnableAsync开启异步任务定时任务相关EnableScheduling 在配置类上使用开启计划任务的支持类上Scheduled 来申明这是一个任务包括cron,fixDelay,fixRate等类型方法上需先开启计划任务的支持Enable 注解说明这些注解主要用来开启对xxx的支持。EnableAspectJAutoProxy 开启对AspectJ自动代理的支持EnableAsync 开启异步方法的支持EnableScheduling 开启计划任务的支持EnableWebMvc 开启Web MVC的配置支持EnableConfigurationProperties 开启对ConfigurationProperties注解配置Bean的支持EnableJpaRepositories 开启对SpringData JPA Repository的支持EnableTransactionManagement 开启注解式事务的支持EnableCaching 开启注解式的缓存支持测试相关注解RunWith 运行器Spring中通常用于对JUnit的支持ContextConfiguration用来加载配置ApplicationContext其中classes属性用来加载配置类SpringMVC部分EnableWebMvc 在配置类中开启Web MVC的配置支持如一些ViewResolver或者MessageConverter等若无此句重写WebMvcConfigurerAdapter方法用于对SpringMVC的配置。Controller 声明该类为SpringMVC中的ControllerRequestMapping 用于映射Web请求包括访问路径和参数类或方法上ResponseBody 支持将返回值放在response内而不是一个页面通常用户返回json数据返回值旁或方法上RequestBody 允许request的参数在request体中而不是在直接连接在地址后面。放在参数前PathVariable 用于接收路径参数比如RequestMapping(“/hello/{name}”)申明的路径将注解放在参数中前即可获取该值通常作为Restful的接口实现方法。RestController 该注解为一个组合注解相当于Controller和ResponseBody的组合注解在类上意味着该Controller的所有方法都默认加上了ResponseBody。ControllerAdvice 通过该注解我们可以将对于控制器的全局配置放置在同一个位置注解了Controller的类的方法可使用ExceptionHandler、InitBinder、ModelAttribute注解到方法上这对所有注解了 RequestMapping的控制器内的方法有效。ExceptionHandler 用于全局处理控制器里的异常InitBinder 用来设置WebDataBinderWebDataBinder用来自动绑定前台请求参数到Model中。ModelAttribute 本来的作用是绑定键值对到Model里在ControllerAdvice中是让全局的RequestMapping都能获得在此处设置的键值对。往期推荐Spring Cloud Alibaba Nacos 服务注册与发现功能实现2022-02-07 Nacos服务注册与发现的2种实现方法2022-02-09 Spring Boot Admin贼好使2022-01-14 求点赞、在看、分享三连
http://www.zqtcl.cn/news/822809/

相关文章:

  • wap网站制作网络设计公司经营范围
  • 织梦网站被做跳转还被删除文件第三方电子商务平台有哪些
  • 财经网站源码 织梦游戏ui培训
  • 石家庄站布局图网站建设公司怎么
  • 电商网站建设选迅法网东莞系统网站建设
  • 网站栏目 英文wordpress 情侣
  • 济南市历下区建设局官方网站wordpress 作者页
  • 武进建设银行网站首页大型网站建设哪家快
  • 做网站用vs怎么自己写代码做网站
  • 网站建设产品需求文档技术培训学校机构
  • 简单个人网站源码石景山网站seo优化排名
  • 用花生做网站房地产电子商务的网站建设
  • 宁波网站建设团队sem竞价托管多少钱
  • 工艺品东莞网站建设营销助手app
  • 怎么添加网站 多少钱wordpress 在线教育模板
  • 做鞋的垂直网站小型购物网站模板
  • 石家庄公司网站建设网站建设技术难点
  • 阿里云能放企业网站吗建设网站的建设费用包括什么
  • 网站对公司的作用是什么初学者学做网站用什么软件
  • 网站的建设模式高校后勤网站建设要求
  • 网站的导航栏怎么做的网站seo诊断报告怎么写
  • elementui 做的网站写网站编程需要什么
  • 一站式网站建设顾问小程序小游戏开发
  • 网站导航html网站开发从哪开始学
  • 成立网站是不是需要先成立公司上海今天新闻发布会直播
  • 企业只有建立了自己的网站网站建设骗子
  • 凡科 360免费建站培训网页制作机构
  • 做网站用什么后缀好法人变更在哪个网站做公示
  • 公司建一个网站多少钱戴尔公司网站建设
  • 可以做试卷网站数学试卷小学六白沟网站开发