spring

哇 心态崩了–google一堆资料能运行的没几个,以及上来就是一大堆代码,一点循序渐进的学习过程都没有,而且也没有不用和用的对比显示的区别

最后还是看了实验楼爸爸的spring教程,感谢!!感谢!!


我使用的环境

  • OS:4.9.0-deepin4-amd64 是Debian分 支下类似Ubuntu的
  • javac/java: javac 1.8.0_111 [apt-get install default-jdk]
  • maven : Apache Maven 3.3.9
  • idea : 2017.1

然后 学spring之需要有些的基础知识,个人认为是必备

代码层面的基础

  • JAVA SE/ core-java /就是基本的语法 类啊 继承啊 IO啊之类的东西
  • xml 这个看得很快的 就是个xml是个怎样的数据结构

要用的工具层面

  • maven [apt-get install maven] 看看5Min GuideGetting start 不需要太细 但要理解单独的maven是个啥
  • javac 大自感受了一下java的代码中的.和文件路径的/的关系
  • idea [apt-get install idea] 我用的IDE

知识层面


然后学习路径跟着实验楼爸爸的教程就好了 :-) 这里只做一些个人的笔记

idea相关

总的流程讲道理比eclipse简洁太多

Ctrl+Alt+Shift+SModules->Sources 代码根目录需要Mark as为Sources才能 右键添加Java类:-),resources文件夹也需要Mark as 成Resources

新建类 直接输入从起始到类名 如 com.abc.HelloWorld

运行左边的Edit Configurations->左上角加号->Application->设置Main class即可

新建xml中有spring选项简直完美

maven 相关

pom.xml中需要加上对spring的具体的某些库的依赖的配置 然后idea/maven会自动帮你下载:-)

spring 相关

一个bean 的 id 是一个随意的名字 它可以被java代码通过改名字得到

class是对应的Java代码的具体的类

name/value以键值对的形式 设置class类中的name对应的field

1
2
3
4
<bean id="FileNameGenerator" class="com.shiyanlou.spring.bean.FileNameGenerator">
<property name="name" value="shiyanlou"/>
<property name="type" value="txt"/>
</bean>

把bean设为另一个bean的使用ref

1
2
3
4
5
6
7
8
9
<bean id="CustomerBean" class="com.shiyanlou.spring.innerBean.Customer">
<property name="person" ref="PersonBean" />
</bean>

<bean id="PersonBean" class="com.shiyanlou.spring.innerBean.Person">
<property name="name" value="shiyanlou" />
<property name="address" value="chengdu" />
<property name="age" value="25" />
</bean>

用java代码得到bean

1
2
context = new ClassPathXmlApplicationContext("SpringBeans.xml");   //xml的文件名
Customer obj = (Customer) context.getBean("CustomerBean"); //上面的一个具体的id

bean的参数scope

  1. singleton — 单例模式,由 IOC 容器返回一个唯一的 bean 实例。
  2. prototype — 原型模式,被请求时,每次返回一个新的 bean 实例。
  3. request — 每个 HTTP Request 请求返回一个唯一的 Bean 实例。
  4. session — 每个 HTTP Session 返回一个唯一的 Bean 实例。
  5. globalSession — Http Session 全局 Bean 实例。

example:

<bean id="CustomerService" class="com.shiyanlou.spring.customer.services.CustomerService" scope="prototype"/>


bean 除了基本的int string也支持java的list map等 见实验楼爸爸的文档


代码中的spring @Component

1
2
3
4
5
6
packeage com.shiyanlou.spring;

@Component("shiyanlou")
public class shiyanlou{

}

与在XML中配置以下效果相同

1
<bean id="shiyanlou" class="com.shiyanlou.spring.shiyanlou">

还有@Autowired,@Configuration@Bean


自动扫描组件 减少 xml的繁琐配置

@Component +@Autowired+

1
<context:component-scan base-package="com.shiyanlou.spring" />

默认情况下,Spring 将把组件 Class 的第一个字母变成小写,来作为自动扫描组件的名称,例如将 CustomerService 转变为 customerService


增加代码阅读性

  1. @Component ——表示一个自动扫描 component
  2. @Repository ——表示持久化层的 DAO component
  3. @Service ——表示业务逻辑层的 Service component
  4. @Controller ——表示表示层的 Controller component

用filter+regex来include 省去@Component

1
2
3
4
<context:component-scan base-package="com.shiyanlou.spring" >
<context:include-filter type="regex" expression="com.shiyanlou.spring.dao.*DAO.*" />
<context:include-filter type="regex" expression="com.shiyanlou.spring.services.*Service.*" />
</context:component-scan>

自动装配Bean 属性autowire //自动装配如果找不到即为null

  1. no —— 默认情况下,不自动装配,通过 ref attribute手动设定。
  2. byName —— 根据 Property 的 Name 自动装配,如果一个 bean 的 name ,和另一个 bean 中的 Property 的 name 相同,则自动装配这个 bean 到 Property 中。
  3. byType —— 根据 Property 的数据类型( Type )自动装配,如果一个 bean 的数据类型,兼容另一个 bean 中 Property 的数据类型,则自动装配。
  4. constructor —— 根据构造函数参数的数据类型,进行 byType 模式的自动装配。
  5. autodetect —— 如果发现默认的构造函数,用 constructor 模式,否则,用 byType 模式。

spring 之 AOP

Advice

需要CGLIB2库 据搜索说是因为spring的aop的实现是基于该库

四种Advice 调用前 调用后 抛出异常 围绕,通过java实现spring的对应interface的类A,再通过xml配置target要切入的类B 和用来切入A 即可对指定类进行切入.deamo:

1
2
3
4
5
6
7
8
<bean id="customerServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="customerService" />
<property name="interceptorNames">
<list>
<value>hijackAroundMethodBean</value>
</list>
</property>
</bean>

Pointcut & Advisor

在上面的基础上再用 这两个 可以对指定的function才做切入

  • Advice:向程序内部注入的代码。
  • Pointcut:注入 Advice 的位置,切入点,一般为某方法。
  • Advisor: Advice 和 Pointcut 的结合单元,以便将 Advice 和 Pointcut 分开实现灵活配置。

auto proxy

代替ProxyFactoryBean用BeanNameAutoProxyCreator来自动批量切面,demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>customerAdvisor</value>
</list>
</property>
</bean>

AspectJ

又是对上面的 美化/简化

  • @Before
  • @After
  • @AfterReturning
  • @AfterThrowing
  • @Around