spring

spring是一款轻量级的控制反转和面向切面编程开源框架,

spring核心容器的主要组件是Bean工厂(BeanFactory),Bean工厂使用IOC模式来降低程序代码之间的耦合度,并提供了AOP的实现

Spring常用注解(annotion):

1.@Controller:用于标注控制层组件,

2.@Service:用于标注业务层组件,

3.@Component:用于标注这是一个受Spring管理的组件,组件引用名称是类名,第一个字母小写。可以使用@Component("beanID")指定组件的名称

4.@Repository:用于标注数据访问层组件,即DAO组件

5.@Bean:方法级别的注解,主要用在@Configuration 和 @Component 注解的类里,

@Bean注解的方法会产生一个Bean对象,该对象有Spring管理并放到IOC容器中。引用名称是方法名,也可以使用@Bean("beanID")指定组件名

6.@Scope("prototype"):将组件的范围设置为原型的(即多例)。保证每一个请求有一个单独的action来处理,避免action的线程问题。

由于Spring默认是单例的,只会创建一个action对象,每次访问都是同一个对象,容易产生并发问题,数据不安全。

7.@Autowired: 默认按类型进行自动装配。在容器查找匹配的Bean,当有且只有一个匹配的Bean时,Spring将其注入该注解标注的变量中。

8.@Resource:默认按名称进行自动装配,当找不到与名称匹配的Bean时会按类型装配。

@Autowired 和 @ Resource 的区别:

@Autowired默认按类型进行自动装配(属于Spring),默认情况下要求依赖对象必须存在,如果要允许为null,需设置required属性为false,@Autowired(required="false"),

如果要使用名称进行装配,可以使用与@Qualifier注解一起使用,例如: @Autowired  @Qualifier("adminService")  private  AdminService   adminService;

@Resource默认是按照名称进行匹配(属于J2EE),名称可以通过name属性来指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行装配。

当找不到与名称相匹配的Bean时,会按照类型进行装配。但是,name属性一旦指定,就只会按照名称进行装配。

 

IOC/DI(控制反转/依赖注入):当创建对象时,把控制权交给Spring容器 / IOC容器会把当前对象所需要的外部资源动态的注入给我们。

DI主要有四种方式:

1.基于注解注入方式(推荐使用)

2.set注入方式

3.构造器注入方式

4.静态工厂注入方式

 

AOP(面向切面编程):就是纵向的编程。例如业务A和业务B现在需要一个相同的操作,传统方法我们可能需要在业务A、B中都加入相关操作代码,

而使用AOP就可以只写一遍代码,业务A、B共用这段代码。并且,当业务A、B需要增加新的操作时,可以在不改动原代码的情况下,灵活添加新的业务逻辑实现。

AOP主要应用于签名验证,参数校验,日志记录,事物控制,权限控制,性能统计,性能统计,异常处理

 

切面(Aspect):共有功能的实现。如日记切面,权限切面,验签切面等。在实际开发中通常是一个存放共有功能实现的标准Java类。

当Java类使用了@Aspect注解修饰时,就能被AOP容器识别为切面

通知(Advice):切面的具体实现。就是要给目标对象织入的事情。以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before),后置通知(AfterReturning)

异常通知(AfterThrowing),最终通知(After)和环绕通知(Around)五种。在实际开发中通常是切面类中的一个方法,具体属于哪类通知,通过方法上的注解区分。

连接点(JoinPoint):程序在运行过程中能够插入切面的地点。例如:方法调用,异常抛出等。Spring只支持方法级的连接点,一个类的所有方法前,后,抛出异常时等都是连接点。

切入点(PointCut):用于定义通知应该切入到哪些连接点上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。

切入点就是用来定义哪些类里的哪些方法会得到通知。

目标对象(Target):哪些即将切入切面的对象,也就是被通知的对象。这些对象专注业务本身的逻辑,所有的共有功能等待AOP容器的切入。

代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于对象本身业务逻辑加上共有功能。

代理对象对于使用者是透明的,是运行过程中的产物。目标对象被织入共有功能后产生的对象。

织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译时,类加载时,运行时。

Spring是在运行时完成织入,运行时织入通过Java语言的反射机制与动态代理机制来动态实现。

 

posted @ 2022-05-05 22:04  luoshen-luo  阅读(31)  评论(0编辑  收藏  举报