一、spring从体系架构上分为
1. 基本组件框架组合:Spring Framework
2.专项领域应用组件:Spring Portfolio
这个Spring Portfolio主要应用满足于特定的的应用场合:包括了spring Security/spring boot等等
这里主要阐述基本组件框架组合:Spring Framework。
二、Spring Framework
spring框架的发布版本包括了20个不同的模块。每个模块有3个JAR文件。这20个模块依据所属功能可以划分为6类不同的功能!如下图:
1. spring核心容器
核心容器是spring框架最核心的部分,它管理着spring应用中bean的创建、配置和管理等等主要为ID依赖注入功能!该功能是spring的两大核心之一!
2. spring的AOP模块
这个模块是spring应用系统中开发切面的基础
3. 数据访问和集成:
主要用于访问数据持久层(数据库数据等)。包括了简化的JDBC、DAO及框架型ORM如:Mybatis和Hibernate
4. Web和远程调用
此部分解决了web应用的MVC模型。所以这里集合了spring-MVC框架。另外还支持了用于分布式场景的REST API标准等等!
5. Instrumentation:提供JVM的代理
6. 测试:这是spring的测试单元模块,可以模拟用户的请求场景等测试!
三、spring的两个核心内容
DI【依赖注入】和AOP【面向切面】
1. spring DI【依赖注入】
A. 简化POJO老式Java开发,实现解耦!
B. 注入的方式有很多,最常见几种注入方式【装备方式】:推荐用自动配置的机制!
C. 一个完整的注入流程:
C1. 由servlet容器(tomcat)的web.xml或者测试单元的@RunWith(SpringJunit4ClassRunner.class)创建spring容器(分为bean工厂+多种spring上下文)(常用的XmlWebApplicationContext:用于加载XML方式的bean注入和AnnotationConfigWebApplicationContext:用于javaConfig注入方式!),并通过spring容器结合配置文件创建各种各样的组件bean!多数使用上下文作为spring容器多一点!所以下方以上下文为例!
C2. 通过spring上下文对象去加载配置文件(JavaConfig的@Configuration或者XML配置都可以)
C3. spring上下文通过配置文件发现(扫描也好配置也好)了bean之后并创建bean,然后查看在哪注入,就进行组装和注入了!并创建这些组件bean之间的关联关系!
1)借助JavaConfig+@Bean完成显式注入:
a. 带有@Bean注解的方法可以采用任何必要的Java功能来产生bean实例。这种方式主要应用于注入第三方库的场景,因为我们没办法在别人的代码里面去声明一个带有我们要注解的bean!
b.这种方式直接编写一个配置类(javaConfig)@Configuration注解:表示这是一个配置类!
c.然后在这个配置类中添加方法(这个方法可以是构造方法或者是Setter方法)并带上注解@Bean!这个方法返回的是一个实例化new对象。通过这个方法返回一个对象,即可完成一次注入!
d.@Bean("id")可以给bean定义一个ID
e.bean的单例性,可将同一个bean实例注入到任意数量的其他bean中!
使用Javaconfig的时候,要创建一个带有@Configuration注解的类!
2)xml配置:
a.要创建一个XML文件,并以<beans>元素为根
b.创建<bean>元素【等同于javaConfig的@Bean注释方法!注解】
c. 填写id和class(指定到对应的java类)
a/b/c完成了一个原材料Bean的定义!
<bean id="compactDisc" class="soundsystem.SgtPeppers"/>
d. 定义另外一个<bean>配置类Bean(等同于JavaConfig配置类),然后在这个使用者中通过constructor-arg(这是)引用材料bean的id
d1.构造方式【引入ref】注入
<bean id="cdPlayer" class="soundsystem.CDPlayer">
<constructor-arg ref="compactDisc" />
<bean/>
d2.构造方式字面量【value属性】注入[这里用了spring的c命名空间等同于constructor-arg]
<bean id="compactDisc">
class="soundsystem.BlankDisc"
c:_tittle="THIS IS TITTLE"
c:_artist="ARTIST NAME"
<bean/>
这个方式注入的时候可以通过<set><list>元素注入多个参数!
e. Setter注入方式!
在使用者类没有显式的编写构造函数的时候(只有默认隐式)推荐使用此方式注入!Setter方式的注入需要在<bean>元素标签中使用<property>注入到compactDisc的compactDisc属性中(setCompactDisc()Setter方法)(如下例子):property的命名空间是p!Setter同样有ref引用方式和字面量<value>方式!
<bean id="cdPlayer" class="soundsystem.CDPlayer">
<property name="compactDisc" ref="compactDisc"/>
<bean/>
3) 自动化装配bean(推荐)
A. 创建被发现扫描的bean类
@Component注解和@Named
:表明该类会作为组件,并告知spring为这个类创建bean。我们知道以上javaConfig装配或者XML装配也好都会给相关的bean命名ID。当然用@Component(id)和@Named(id)也是可以的。
B. 配置启动扫描类:
a. @Configuration+@ComponentScan注解:这个注解能在spring中启动组件扫描,默认会扫描与之同一个package包下的所有类和子包。当然这个启动扫描也可以指定到特定的包或几个包!
@Configuration的作用同上述Javaconfig方法装配bean一样表明这个类是一个配置类
b. 使用XML来启动扫描:<context:component-scan>元素
C. @Autowired完成注入:
如何加载配置:@ContextConfiguration注解—》加载刚 @Configuration+@ComponentScan注解的bean启动扫描——》扫描到同一个包下的所有@Component注解的bean!——》通过@Autowired注解在属性上完成bean的注入!
@Autowired(或者java的规范注入:@Inject)在使用类中的构造方法或者Setter方法中或者其他方法上加入@Autowired,并在方法的参数中传入要注入的bean作为参数即可完成自动装配的注入!【有点类似javaConfig方式的@Bean注解,但是有区别,@Bean是返回一个new实例,而@Autowired是通过参数传入】
4)三种装配方法对比
javaConfig方式 | XML方式 | 自动化装配 |
配置Bean类+材料Bean类 | 创建一个以<beans> 元素为跟的XML文件 | 配置&扫描类+被发现的材料bean类 |
无需创建材料类bean! | 创建<bean>基本材料bean, 指明ID和包名 | 创建一个可被发现的材料bean: @Component注解和@Named |
@Configuration注解定义一个配置类 | 创建<bean>配置类bean! | @Configuration定义配置类且 @ComponentScan注解:启动组件扫描 或者使用XML定义扫描 <context:component-scan> |
在统一个配置类中通过@Bean注解的方法 返回一个new实例完成注入 | 通过<constructor-arg>构造方式 和<property>的Setter方式完成注入 | 默认自动扫描所配置的扫描类的 同一个包下的所有包和类.最后通过 @Autowired注解的方法以 要引入的对象属性参数形式自动注入! |
主要应用于注入第三方jar库的场景 | 配置式的编程方式! | 推荐! |
2. spring AOP面向切面编程
主要应用于日志、事务、安全等不需要参与到主业务的代码的工作,悄悄的去监督主业务的代码!
关键词:
连接点:所监控对象类的所有接口
切 点:所需要关注的特定的入口。在spring AOP中要使用AspectJ的切点表达式语言来定义切点!
execution(* concert.Performance.perform(..))
通 知:触发器
切 面:以@Aspect注解的类! 切点和通知的结合:一个切面有五个触发器:
@After/@AfterReturning/@AfterThrowing/@Around/@Before
织 入:把切面真正的启动开始执行监控工作!
引 入:给监控对象偷偷的“私自”添加新的方法而不打扰对象本身!
AOP如何跟注入的Bean配合呢?
四、spring应用于WEB(spring MVC)
由web.xml(或者其他方法)配置DispatcherServlet,当DispatcherServlet启动时,会创建spring应用上下文。这个上下文会同普通spring上下文一样去加载配置类的bean(java:@EnableWebMVC)或者XML(特殊的命名方式)。在配置类或者配置XML里要声明视图解析器、组件扫描器、静态资源处理等等。这样就和普通的spring过程一样了!有个区别是使用spitter.web包的@Controller(控制类)一系列注解代替普通的扫描注解@Component-Scan!
1. @Controller注解同@Component注解的方法一样!是为了让扫描发现自己!
2. @RequestMapping注解到控制类方法上:声明了他们所需要处理的请求
3.@RequestMapping分解级别!
4. mock Spring MVC来来模拟执行HTTP请求!从这个模拟中可以看出要不要返回视图是看请求方的意愿了!
5. JSP如何访问spring后台返回的Model数据呢?通过JSTL!
6. 接收请求的输入:@RequestParam注解获取HTTP中输入参数!如果没有对应的value值就会给定默认值!这个@RequestParam可以放在方法参数中,也可以放在方法中修饰变量!
7. RPC和URL的区别?理想情况下应该通过URL的形式发起请求,因为能完整的知道资源的路径。而如果RPC(域名地址+?参数=dd...)通过参数去访问资源就隐藏了中间的地址了!
8. 接收占位符!
9. 带有重定向式的视图:redirect:前缀!
10. 校验注解:直接通过注解去校验。而不用自己动手写校验方法!
11. 重定向:P165
12. 传递负责的数据!
五、spring所支持的业务框架
1. spring web flow:适合元素按规定的流程运行!
2. spring security:解决spring的安全:认证、拦截、过滤等等!
六、 spring ORM:Hibernate/Mybatis...
七、 spring REST API
八、 spring boot
九、spring Email
十. SSM