Spring核心理解
1.关于spring容器:
spring容器是Spring的核心,该 容器负责管理spring中的java组件,
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");//这种方式实例化容器,容器会自动预初始化所有Bean实例
ctx.getBean("beanName");
ApplicationContext 实例正是Spring容器。
ApplicationContext容器默认会实例化所有的singleton Bean
Spring容器并不强制要求被管理组件是标准的javabean。
2.Spring的核心机制:依赖注入。
不管是依赖注入(Dependency Injection)还是控制反转(Inversion of Conctrol),其含义完全相同:
当某个java实例(调用者)需要调用另一个java实例(被调用者)时,传统情况下,通过调用者来创建被调用者的实例,通常通过new来创建,
而在依赖注入的模式下创建被调用者的工作不再由调用者来完成,因此称之为"控制反转";创建被调用者实例的工作通常由Spring来完成,然后注入调用者,所以也称之为"依赖注入"。
IOC:Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制,所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系
3.Spring的“零配置”支持
①搜索Bean类
Spring提供如下几个Annotation来标注Spring Bean:
@Component标注一个普通的Spring Bean;
@Controller:标注一个控制器组件类;
@Service:标注一个业务逻辑组件类;
@Repository:标注一个Dao组件;
<context:component-scan base-package=""/>
在默认的情况下,自动搜索所有以@Component、@Controller、@Service、@Repository注释的java类,当作Spring Bean处理。
还可以通过<context:component-scan base-package=""/>子元素<include-filter>/<exclude-filter>
②指定Bean的作用域:
如:
@Scope("prototype")
@Component("axe")
public class SteelAxe implements Axe{
}
③使用@Resource配置依赖:
@Resource有一个name属性,在默认的情况下,Spring将这个值 解释为需要被注入的Bean的实例的名字,换句话说,使用@Resource与<property../>元素的ref属性具有相同的效果。
当使用@Resource修饰setter方法,如果省略name属性,则name属性默认是从该setter方法去掉set子串,首字母小写的到的子串。
当使用@Resource修饰Field时,如果mame,则默认与Field的相同。
④自动装配和精确装配:
Spring提供@Autowired来指定自动装配,使用@Autowired可以标志setter方法、普通方法、和构造器
⑤使用@Qualifier精确装配
正如上面的@Autowired总是采用byType的自动装配策略。在这种情况下,符合自动和装配的类型的Bean常常有多个这个时候就会引发异常了。
为了实现精确的配置,Spring提供@Qualifier,可以根据Bean标识来指定自动装配
4.Spring的AOP:
AOP的基本概念:
AOP框架不与特定的代码耦合.下面是一些面向切面编程的术语:
切面(Aspect):业务流程运行到某个特定的步骤,也就是一个应用运行的关注点,关注点可能横切多个对象,所以常常也被称为横切关注点。
连接点(Joinpoint):程序执行过程明确的点,如方法的调用、异常的抛出,Spring AOP中连接点总是方法的调用。
增强处理(Advice):AOP框架在特定的切入点执行的增强处理,处理有around、before和After等类型。
切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式。 Spring定义了Pointcut接口,用来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解, MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上
引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。Spring中要使用Introduction, 可有通过DelegatingIntroductionInterceptor来实现通知,通过DefaultIntroductionAdvisor来配置Advice和代理类要实现的接口
目标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。POJO
AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
用通俗易懂的说来说就是, 我们学java,是在桌面上应用的,接触了web开发,学会了jsp、servlet.我们在页面上如果要调用一个对象,调用一个方法,肯定首先要new一个,然后再用代码去完成这个逻辑。servlet完全的代码输出,jsp加入了标签,省去了一些常用的标签。spring是干嘛呢,你可以理解就是一个大的容熔炉,他把所有要去用到的逻辑代码作为标签一样放到他的bean工厂里,每个bean取个名字。管理全部交给容器去处理了,你不要再去new了,再去硬代码了。每个类之前的引用,我们可以在容器中去配置,让容器去处理,哪个类作为哪个类的属性,这个就叫注入。spring既然是一个大的容器,那么他就站在一个高度,俯视着所有用到的java对象以及对象里的方法。那么就很容易对方法排排队、做做分类。一个人的对象,他有个方法叫吃法。我们能俯视一切,当然就可以管理这个对象,你要吃饭前,要报告:我吃饭了。吃饭后,要说:我吃饱了。在做真正的事情前,我可以间隙插入一些额外的事情,当然这些事情肯定是使用spring的人对他做的设置。这个就是AOP的概念。这是基于 java 反射实现的。 |
|