Spring课程
1Spring基本特征
Spring是一个非常活跃的开源框架;它是一个基于Core来构架多层JavaEE系统的框架,它的主要目地是简化企业开发.
Spring以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring
2Spring的组成
2.1Spring的jar包
到http://www.springsource.org/download下载spring,然后进行解压缩,在解压目录中找到下面jar文件,拷贝到类路径下
--spring的核心类库在spring文档的dist下
dist\spring.jar
--引入的第三方类库都spring文档的lib下
lib\jakarta-commons\commons-logging.jar
如果使用了切面编程(AOP),还需要下列jar文件
lib/aspectj/aspectjweaver.jar和aspectjrt.jar
lib/cglib/cglib-nodep-2.1_3.jar
如果使用了JSR-250中的注解,如@Resource/@PostConstruct/@PreDestroy,还需要下列jar文件
lib\j2ee\common-annotations.jar
注:JSR(Java规范请求)是指向JCP(JavaCommunityProcess)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR(Java规范请求),以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准
2.2Spring配置文件
默认情况下是applicationContext.xml文件。可以建立很多xml文件,工程中一般都是这样配置的。
2.3SpringAPI
3Spring基本功能详解
3.1SpringIOC
Spring的控制反转:把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。
步骤:
A.启动spring容器
1、在类路径下寻找配置文件来实例化容器
ApplicationContextctx=newClassPathXmlApplicationContext(newString[]{"beans.xml"});可以在整个类路径中寻找xml文件
*通过这种方式加载。需要将spring的配置文件放到当前项目的classpath路径下
*classpath路径指的是当前项目的src目录,该目录是java源文件的存放位置。
2、在文件系统路径下寻找配置文件来实例化容器
ApplicationContextctx=newFileSystemXmlApplicationContext(newString[]{“d:\\beans.xml“});Spring的配置文件可以指定多个,可以通过String数组传入。
注:经常用第一种方法启动容器
B.从spring容器中提取对象
3.2别名
<beans>
<aliasname="person"alias="p"/>
<beanname="person"class="cn.itcast.aliasspring.Person"/>
</beans>
通过这样的配置,可以达到在一个地方命名,在多个地方使用不同的名字的效果。
3.3Spring容器内部对象的创建
3.3.1使用类构造器实例化(默认无参数)
<beanid=“personService"class="cn.itcast.bean.impl.PersonServiceImpl"/>
3.3.2使用静态工厂方法实例化(简单工厂模式)
<beanid="personService"class="com.itcast.factory.PersonServiceFactory"factory-method="createPersonService"/>
publicclassPersonServiceFactory{
publicstaticPersonServicecreatePersonService(){
returnnewPersonServiceImpl();
}
}
3.3.3初始化bean时机
Spring默认在启动时将所有singletonbean提前进行实例化。提前实例化意味着作为初始化的一部分,ApplicationContext会自动创建并配置所有的singletonbean.通常情况下这是件好事。因为这样在配置中有任何错误能立即发现。
Lazy-init=”trueorfalse”
Lazy-init为false,spring容器将在启动的时候报错(比较好的一种方式)
Lazy-init为true,spring容器将在调用该类的时候出错。
3.4Bean的作用域
3.4.1singleton(默认值)
在每个SpringIoC容器中一个bean定义只有一个对象实例(共享)。
默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。如:
<beanid="xxx"class="cn.itcast.OrderServiceBean"lazy-init="true"/>
如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true“,如下:
<beansdefault-lazy-init="true“...>
3.4.2prototype
允许bean可以被多次实例化(使用一次就创建一个实例).Spring不能对一个prototypebean的整个生命周期负责.这就意味着清楚prototype作用域的对象并释放任何prototypebean所持有的昂贵资源都是客户端的责任。
3.4.3Request
3.4.4Session
3.4.5Globalsession
3.4.6指定Bean的初始化方法和销毁方法
Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法。
<beanid=“foo”class=“...Foo”
init-method=“setup”
destory-method=“teardown”/>
当foo被载入到Spring容器中时调用init-method方法。当foo从容器中删除时调用destory-method(scope=singleton有效)
3.5依赖注入(DI)
3.5.1使用构造器注入
使用xml的注入方式
A.通过参数的顺序
<constructor-argindex="0">
<value>张三</value>
</constructor-arg>
<constructor-argindex="1">
<value>56</value>
</constructor-arg>
B.通过参数的类型
<constructor-argtype="java.lang.Integer">
<value>56</value>
</constructor-arg>
<constructor-argtype="java.lang.String">
<value>张三</value>
</constructor-arg>
3.5.2使用属性setting方法进行注入
使用xml的注入方式:
A.简单Bean的注入
简单Bean包括两种类型:包装类型和String
<beanid="personService"class="com.itcast.bean.impl.PersonServiceImpl">
<!--基本类型,string类型-->
<propertyname="age"value="20"></property>
<propertyname="name"value="张无忌"></property></bean>
B.引用其他Bean
<beanid="person"class="com.itcast.bean.Person"/>
<beanid="personService"class="com.itcast.bean.impl.PersonServiceImpl">
<propertyname="person"ref="person"/>
</bean>
3.5.3装配list集合
3.5.4装配set集合
3.5.5装配map
<propertyname="maps">
<map>
<entrykey="01">
<value>map01</value>
</entry>
<entrykey="02">
<value>map02</value>
</entry>
</map>
</property>
map中的<entry>的数值和<list>以及<set>的一样,可以使任何有效的属性元
素,需要注意的是key值必须是String的。
3.5.6装配Properties
<propertyname="props">
<props>
<propkey="01">prop1</prop>
<propkey="02">prop2</prop>
</props>
</property>
3.6注解注入
步骤:
A.在配置文件中,引入context命名空间
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
B.在配置文件中加入context:annotation-config标签
<context:annotation-config/>
这个配置隐式注册了多个对注释进行解析处理的处理器
AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,
PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor
注:@Resource注解在spring安装目录的lib\j2ee\common-annotations.jar
3.6.1@Autowired
这两个注解的区别是:@Autowired默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。
3.6.2@Qualifier
如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
3.6.3@Resource
1、@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上.
2、@Resource注解默认按名称装配。
名称可以通过@Resource的name属性指定,如果没有指定name属性,
•当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象
•当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
•注意:如果没有指定name属性,并且按照默认的名称找不到依赖对象时,@Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
3.6.4@PostConstruct
指定Bean的初始化方法
3.6.5@PreDestroy
指定Bean的销毁方法
3.7扫描注入
前面的例子我们都是使用XML的bean定义来配置组件。在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。spring2.5为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。要使用自动扫描机制,我们需要打开以下配置信息:
1、引入context命名空间需要在xml配置文件中配置以下信息:
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scanbase-package="cn.itcast"/>
</beans>
2、在配置文件中添加context:component-scan标签
<context:component-scanbase-package="cn.itcast"/>
其中base-package为需要扫描的包(含子包)。
注:
1、在使用组件扫描元素时,AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor会隐式地被包括进来。也就是说,连个组件都会被自动检测并织入-所有这一切都不需要在XML中提供任何bean配置元数据。
2、功能介绍
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)、
@Repository用于标注数据访问组件,即DAO组件。
而@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
3.8spring中的继承
Person类如图所示:
Student类如图所示:
配置文件中:
图中的配置文件中,parent为student在容器中继承person.如果去掉person是不行的。
4面向切面编程
4.1代理模式
代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用
A.抽象主题角色
声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题
B.代理主题(Proxy)角色:
代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题控制对真实主题的引用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯地将调用传递给真实主题对象。
C.真实主题角色
定义了代理角色所代表地真实对象
4.1.1JDK动态代理
JDK的动态代理必须具备四个条件:
目标接口
目标类
拦截器
代理类
总结:1、因为利用JDKProxy生成的代理类实现了接口,所以目标类中所有的方法在代理类中都有。
2、生成的代理类的所有的方法都拦截了目标类的所有的方法。而拦截器中invoke方法的内容正好就是代理类的各个方法的组成体。
3、利用JDKProxy方式必须有接口的存在。
4、invoke方法中的三个参数可以访问目标类的被调用方法的API、被调用方法的参数、被调用方法的返回类型。
4.1.2CGLIB做代理
1、CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
2、用CGlib生成代理类是目标类的子类。
3、用CGlib生成代理类不需要接口
4、用CGLib生成的代理类重写了父类的各个方法。
5、拦截器中的intercept方法内容正好就是代理类中的方法体
spring有两种代理方式:
1.若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
优点:因为有接口,所以使系统更加松耦合
缺点:为每一个目标类创建接口
2.若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。
缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。
4.1.3Spring的动态代理
1、拦截器必须实现MethodInterceptor接口
2、在spring中的配置
总结:不管采用JDK动态代理生成代理类还是采用CGLIB生成动态代理类。目标类中的所有方法都被拦截下来。而在哪个方法里做比如权限的判断、安全性的检查等一系列工做必须在拦截器中作相应的判断。但是这样的编程形式给程序的编写带来了一定的麻烦。
1、在拦截器中控制哪些方法将被做权限判断、安全性检查等是一件比较困难的事情。
A.采取这样的配置目标类只能是一个,所以如果用这种方法做权限控制,得写很多代理,这样给代码的书写造成了困难。
B.每一个类中的每一个方法如果都有不同的权限(实际的系统往往都是这样的),在拦截器中的判断代码书写会很困难。
2、这样的代码也会导致硬编码,也就是说我们必须在拦截器中写一些权限判断等事情,会导致拦截器中代码量的增大,造成维护的麻烦。
4.2AOP编程
4.2.1概念:
A.Aspect(切面)
比如说事务、权限等,与业务逻辑没有关系的部分
B.joinpoint(连接点)
目标类的目标方法。(由客户端在调用的时候决定)
C.Pointcut(切入点)
所谓切入点是指我们要对那些拦截的方法的定义.
被纳入springaop中的目标类的方法。
D.Advice(通知)
所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
E.Target(目标对象):
代理的目标对象
F.Weaving(织入)
是指把切面应用到目标对象来创建新的代理对象的过程.切面在指定的连接点织入到目标对象
JDKProxy代理
|
SpringAop
|
目标对象
|
目标对象
|
拦截器类
|
切面
|
拦截器类中的方法
|
通知
|
被拦截到的目标类中方法的集合
|
切入点
|
在客户端调用的方法(目标类目标方法)
|
连接点
|
代理类
|
AOP代理
|
代理类的代理方法生成的过程
|
织入
|
通知根据拦截目标类中的目标方法的位置不一样可以分为:前置通知、后置通知、最终通知、环绕通知、异常通知
4.2.2AOP实现的两种模式
4.2.2.1xml形式
A.前置通知
在spring配置文件中声明切面
在spring配置文件中声明目标类
定义切面、切入点、通知
注:见6.2.3.4
说明:
1、在切面类中,没有必要实现接口,但方法名称要与<aop:beforemethod=”checkSecurity”中的checkSecurity一样。
2、checkSecurity方法中通过JoinPoint参数可以获得目标类的目标方法名称、参数值等信息。
B.后置通知
1、没有特殊说明的地方和前置通知是一样的。
2、在spring配置文件中
3、在拦截器中的方法要和checkSecurity方法一样,有两个参数
JoinPointpoint可以获得目标方法和参数值
Objectval这里的名字要和returning=”val”中保持一致,指的是方法的返回值。
4、returning=”val”时,通知里可以有返回参数,这个参数只能决定通知里能不能拿到方法的返回值,和客户端没有关系。
5、在执行目标类的目标方法中遇到异常,则不执行后置通知。
C.异常通知
1、没有特殊说明的地方和前置通知一样
2、在spring配置文件中
其中throwing指定了传递异常的参数名称
3、在异常通知中(拦截器)中,必须是checkSecurity方法。方法中有两个参数
JoinPointpoint可以获得方法的名称、参数
Throwableex利用ex.getMessage()可以获得异常信息
D.最终通知
1、没有特殊说明,和前置通知的配置一样。
2、在spring配置文件里:
说明:在最终通知中不受异常的影响。也就是说不论目标方法执行的过程中是否抛出异常,最终通知都将执行。
E.环绕通知
1、没有特殊说明和前置通知的配置保持一致。
2、在spring文件中
3、在环绕通知中,方法名称为checkSecurity。参数类型为ProceedingJoinPoint。
ProceedingJoinPoint的proceed方法相当于invoke方法,调用目标类的目标方法。ProceedingJoinPoint继承了JoinPoint类
4、能在方法执行的前后加入额外的代码。
说明:
4.2.2.2Aop注解形式
A.前置通知
注意:@Aspectj是按照类型匹配的。
B.后置通知
C.异常通知
D.最终通知
E.环绕通知
5Spring数据库
5.1Spring+JDBC
5.1.1Jdbc编程特点
静态代码+动态变量=jdbc编程。在spring中动态变量可以用注入的形式给予。这样的编程方式适合包装成模板。静态代码构成了模板,而动态变量则是需要传入的参数。
5.1.2引入DataSource
在spring中注入DataSource
5.1.3核心类JdbcTemplate
1、基于模板的设置(为什么可以设置成基于模板的形式)
2、完成了资源的创建和释放的工作
3、简化为我们对JDBC的操作
4、完成了对JDBC的核心流程的工作,包括SQL语句的创建和执行
5、仅需要传递DataSource就可以把它实例化
6、JdbcTemplate只需要创建一次
7、JdbcTemplate是线程安全类
5.1.4使用JdbcTemplate
在Dao类中,用JdbcTemplate作为属性,用spring对JdbcTemplate进行注入。再对JdbcTemplate进行DataSource注入。
注:为什么只要对JdbcTemplate注入DataSource就可以了?
5.1.5继承JdbcDaoSupport
在Dao类中,继承JdbcDaoSupport。因为JdbcDaoSupport已经有了JdbcTemplate的引用,所以只要继承JdbcDaoSupport就相当于有了JdbcTemplate属性。
5.1.6使用properties文件
<beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<propertyname="locations">
<list>
<value>jdbc.properties</value>
</list>
</property>
</bean>
5.1.7RowMapper的使用
1、产生原因:在Jdbc的操作中,有很多情况下是要将ResultSet里的数据封装到一个持久化Bean里,再把持久化Bean封装到集合中。这样会造成大量的代码的重复,不利于代码重用。而RowMapper正好解决了这个问题。
2、使用:
1、写一个类实现RowMapper接口
2、在回调接口中,作为参数进行传入即可。
5.1.8声明式事务管理
5.1.8.1Spring的事务管理器
5.1.8.2Spring事务的传播属性
5.1.8.3Spring事务的隔离级别
5.1.8.4以XML配置的形式
5.1.8.5以注解方式配置
5.1.9使用CGLIB以XML形式配置事务
1、业务逻辑类不能实现接口
2、客户端调用返回的是目标类(代理类的父类)
5.2Spring+Hibernate
5.2.1HibernateTemplate模板
1、如果一个DAO类继承了HibernateDaoSupport,只需要在spring配置文件中注入SessionFactory就可以了。
2、如果一个DAO类没有继承HibernateDaoSupport,需要有一个SessionFactory的属性,并且在配置文件中进行注入。
5.2.2声明式事务
配置XML文件
注解形式:
1、在配置文件中引用spring的自动扫描机制。
2、在配置文件中引入注解解析器
3、在service层通过@Transaction进行注解
6Struts2+spring+hibernate
6.1需要添加的jar包
6.2Spring融合web服务器
1、在web.xml文件中,添加如下配置:
说明:
在web.xml中加载applicationContext.xml文件有几种方式:
A.
如果spring配置文件被命名为applicationContext.xml,并且放在WEB-INF目录下,则不需要配置<context-param>,因为ContextLoaderListener默认在WEB-INF目录下寻找名为applicationContext.xml的文件。若存在多个Spring配置文件,则在<param-value>中依次列出,之间以逗号隔开。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
B.也可以利用上图中的方式来配置:
利用classpath来配置
C.我们一般采用classpath的方式来配置
上面的配置说明在web容器启动的时候,spring容器也启动了。
6.3struts.xml文件
在struts.xml文件中,添加struts2的常量:
struts.objectFactory=spring
在spring中的文件配置:
6.4OpenInSessionView
由于使用的是spring的声明式事务处理方式,所以在调用this.getHibernateTemplate().load方法时,使用了hibernate的懒加载技术。当把一个实体Bean从数据库中加载完以后,只能加载其ID值。这个时候spring的声明式事务处理方式已经把session给关闭掉了。所以当值在页面输出时会产生异常。
处理方式为:OpenSessionInview模式。
相关推荐
3 Spring基本功能详解 8 3.1 SpringIOC 8 3.2别名Alias 11 别名拓展: 11 3.3 Spring容器内部对象的创建 12 Spring容器内部对象创建拓展: 12 3.3.1使用类构造器实例化(默认无参数) 14 3.3.2使用静态工厂方法实例化...
08_编码剖析Spring装配基本属性的原理 09_Spring如何装配各种集合类型的属性 10_使用构造器装配属性 11_用@Resource注解完成属性装配 12_编码剖析@Resource注解的实现原理 13.@Autowire注解与自动装配 14.让...
获取免费Spring 5 新特性视频详解可以群:554355695 在 Spring4.3 之前,JDK基准版本是6。所以 Spring4 必须支持 Java6,7 和8,为了保持向后兼容性, Spring 框架没有适应 Java8 带来的许多新特性,比如 lambda ...
通过本文,读者将能够了解Spring Boot与MongoDB的集成方式,掌握在Spring Boot应用程序中操作MongoDB数据库的基本方法。 随着大数据时代的到来,NoSQL数据库因其灵活的数据模型和高性能的特点逐渐受到开发者的青睐。...
Spring集成邮件发送功能 o1. 添加maven依赖 o2. 添加Spring邮件配置 o3. 创建邮件管理Bean并注入Spring应用上下文 o4. 修改业务逻辑,调用邮件发送功能 邮件发送功能测试 Spring集成JavaMailSender实现邮件...
6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.3.1. 切入点指定者的支持 6.2.3.2. 合并切入点...
6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.4. 声明通知 6.2.5. 引入(Introductions)...
- chapter1:[基本项目构建(可作为工程脚手架),引入web模块,完成一个简单的RESTful API](http://blog.didispace.com/spring-boot-learning-1/) - [使用Intellij中的Spring Initializr来快速构建Spring Boot/...
在当下的市场开发环境中,Spring占据的地位是非常高的,基本已经成为了开发者绕不过去的框架了。它里面包含了Spring,SpringMVC,SpringData(事务),SrpingTest等等。 其中: Spring本身里面包含了两大核心IOC和...
6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.4. 声明通知 6.2.5. 引入(Introduction) 6.2.6. ...
6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.4. 声明通知 6.2.5. 引入(Introductions)...
6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.4. 声明通知 6.2.5. 引入(Introduction) 6.2.6. ...
《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...
《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...
1.5 入门案例详解 11 1.5.1 POM文件 11 1.5.2 主程序类,主入口类 12 1.6 使用Spring Initializer向导快速创建Spring Boot 16 2 Spring Boot配置 18 2.1 配置文件 18 2.2 YML语法 19 2.3 YML配置文件值获取 21 2.4 ...
除了这些基本框架,还有很多其他的工具和技术可以与SSM和Vue.js结合使用,以帮助开发人员更好地构建Web应用程序。例如,开发人员可以使用Spring Security来实现安全性,或者使用Spring Boot来简化应用程序的配置和...
Spring组件自动扫描详解及实例代码 问题描述 一个系统往往有成千上万的组件,如果需要手动将所有组件都纳入spring容器中管理,是一个浩大的工程。 解决方案 Spring 提供组件扫描(component scanning)功能。它能...
本文档提供了对Kafka这一分布式消息系统的全面解析,从基本概念到实际应用,涵盖了其在日志收集、消息系统、用户活动跟踪等方面的使用场景。首先介绍了Kafka的核心概念,如Broker、Topic、Producer、Consumer等,...
ssh整合开发登陆功能步骤详解 使用当前流行框架Struts&Spring;&Hibernate;集成开发web项目。从中体味 struts 的MVC模式、Spring 的依赖注入和hibernate 的持久性的无缝集 成。本文档使用myeclipse工具来开发简单...