Spring
Spring是于2003年兴起的一个轻量级的Java开发框架;
特点:模块化;低侵入性;不重复造轮子,整合其他的框架。
架构图
Bean
Spring core:IOC容器, 解决对象创建及依赖关系,例如一个杯子,我们平常不需要知道它的制作过程,只是把它当作一个工具来使用。对bean的注册叫控制反转,对bean中参数的初始化叫依赖注入。
compareJava
spring |
一切皆bean |
java |
一切皆对象 |
作用域
Prototype
为每一个bean请求提供一个实例。单例的模式由bean factory自身来维护。
Request
在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
Session
与请求范围类似确保每个用户session中有一个bean的实例,在session过期后,bean会随之失效。
Global-session
global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。
注入方式
- 构造器注入
- Setter方法注入
- 接口注入
setter方法注入的例子
DbHelper.java
public class DbHelper { public void add(){ System.out.println("增加订单.."); } }
Order.java
public class Order { // private MysqlHelper helper = new MysqlHelper(); private DbHelper helper; public void setHelper(DbHelper helper) { this.helper = helper; } public void addOrder() { this.helper.add(); } }
AOP
面向切面编程,弥补oop的不足;
步骤
- 将一个类定义为切面(aspect)
- 将类的方法定义为切入点(pointcut)@Pointcut("execution(* com.xyz.myapp.service.*.*(..))") // expression
- 在连接点(Joint point)添加通知(around、before、after和throws等)
应用场景:日志记录,性能统计,安全控制,事务处理,异常处理等等。
注解
@Autowired与@Resource
@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
@Autowired默认按类型装配(这个注解是属于spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
@Autowired() @Qualifier("baseDao") private BaseDao baseDao;
@Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定,
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@Resource(name="baseDao") private BaseDao baseDao;
@Resource注解在字段上,且这个注解是属于J2EE的,减少了与spring的耦合。最重要的这样代码看起来比较优雅。