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 Guide 和 Getting start 不需要太细 但要理解单独的maven是个啥
- javac 大自感受了一下java的代码中的
.
和文件路径的/
的关系 - idea [apt-get install idea] 我用的IDE
知识层面
然后学习路径跟着实验楼爸爸的教程就好了 :-) 这里只做一些个人的笔记
idea相关
总的流程讲道理比eclipse简洁太多
Ctrl+Alt+Shift+S
的Modules->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 | <bean id="FileNameGenerator" class="com.shiyanlou.spring.bean.FileNameGenerator"> |
把bean设为另一个bean的值
使用ref
1 | <bean id="CustomerBean" class="com.shiyanlou.spring.innerBean.Customer"> |
用java代码得到bean
1 | context = new ClassPathXmlApplicationContext("SpringBeans.xml"); //xml的文件名 |
bean的参数scope
- singleton — 单例模式,由 IOC 容器返回一个唯一的 bean 实例。
- prototype — 原型模式,被请求时,每次返回一个新的 bean 实例。
- request — 每个 HTTP Request 请求返回一个唯一的 Bean 实例。
- session — 每个 HTTP Session 返回一个唯一的 Bean 实例。
- 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 | packeage com.shiyanlou.spring; |
与在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
增加代码阅读性
- @Component ——表示一个自动扫描 component
- @Repository ——表示持久化层的 DAO component
- @Service ——表示业务逻辑层的 Service component
- @Controller ——表示表示层的 Controller component
用filter+regex来include 省去@Component
1 | <context:component-scan base-package="com.shiyanlou.spring" > |
自动装配Bean 属性autowire
//自动装配如果找不到即为null
- no —— 默认情况下,不自动装配,通过 ref attribute手动设定。
- byName —— 根据 Property 的 Name 自动装配,如果一个 bean 的 name ,和另一个 bean 中的 Property 的 name 相同,则自动装配这个 bean 到 Property 中。
- byType —— 根据 Property 的数据类型( Type )自动装配,如果一个 bean 的数据类型,兼容另一个 bean 中 Property 的数据类型,则自动装配。
- constructor —— 根据构造函数参数的数据类型,进行 byType 模式的自动装配。
- autodetect —— 如果发现默认的构造函数,用 constructor 模式,否则,用 byType 模式。
spring 之 AOP
Advice
需要CGLIB2
库 据搜索说是因为spring的aop的实现是基于该库
四种Advice 调用前 调用后 抛出异常 围绕,通过java实现spring的对应interface的类A,再通过xml配置target要切入的类B 和用来切入A 即可对指定类进行切入.deamo:
1 | <bean id="customerServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> |
Pointcut & Advisor
在上面的基础上再用 这两个 可以对指定的function才做切入
- Advice:向程序内部注入的代码。
- Pointcut:注入 Advice 的位置,切入点,一般为某方法。
- Advisor: Advice 和 Pointcut 的结合单元,以便将 Advice 和 Pointcut 分开实现灵活配置。
auto proxy
代替ProxyFactoryBean用BeanNameAutoProxyCreator
来自动批量切面,demo:
1 | <bean |
AspectJ
又是对上面的 美化/简化
- @Before
- @After
- @AfterReturning
- @AfterThrowing
- @Around