Spring
2021-03-08 20:07:54 0 举报
AI智能生成
关于Spring,初学者可以看看
作者其他创作
大纲/内容
Ioc(控制反转)
谁控制谁?当然是IoC 容器控制了对象;
控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)
为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;
哪些方面反转了?依赖对象的获取被反转了
哪些方面反转了?依赖对象的获取被反转了
为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;
哪些方面反转了?依赖对象的获取被反转了
哪些方面反转了?依赖对象的获取被反转了
DI(依赖注入)
谁依赖于谁?当然是应用程序依赖于IoC容器
为什么需要依赖?应用程序需要IoC容器来提供对象需要的外部资源
谁注入谁?很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象
注入了什么?就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)简单来说就是Bean
依赖注入的方式
Set注入
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
构造注入
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg name="dataSource" ref="dataSource"/>
</bean>
<constructor-arg name="dataSource" ref="dataSource"/>
</bean>
自动注入
<bean id="iUserDao" class="dao.Impl.UserDaoImpl"/> 与 @Autowired 一起使用
AOP(面向切面编程)
开发术语
Aspect(切面)
通常是一个类,里面可以定义切入点和通知
xmlns:aop="http://www.springframework.org/schema/aop" 名空间
<aop:config>
<!--切面-->
<aop:advisor advice-ref="myBeforeAdvice" pointcut-ref="myPointcut"/>
<aop:advisor advice-ref="myAfterAdvice" pointcut-ref="myPointcut"/>
<aop:advisor advice-ref="myThrowsAdvice" pointcut-ref="myPointcut"/>
<aop:advisor advice-ref="myMethodInterceptor" pointcut-ref="myPointcut2"/>
</aop:config>
<aop:config>
<!--切面-->
<aop:advisor advice-ref="myBeforeAdvice" pointcut-ref="myPointcut"/>
<aop:advisor advice-ref="myAfterAdvice" pointcut-ref="myPointcut"/>
<aop:advisor advice-ref="myThrowsAdvice" pointcut-ref="myPointcut"/>
<aop:advisor advice-ref="myMethodInterceptor" pointcut-ref="myPointcut2"/>
</aop:config>
Joint point(连接点)
程序执行过程中明确的点,一般是方法的调用
Pointcut(切点)
需要做某些处理(如打印日志、处理缓存等等)的连接点
<aop:config>
<!--切点-->
<aop:pointcut id="myPointcut" expression="execution(int com.wk.aop.OperationImpl.*(..))"/>
<aop:pointcut id="myPointcut2" expression="execution(* com.wk.aop.OperationImpl.print())"/>
</aop:config>
<!--切点-->
<aop:pointcut id="myPointcut" expression="execution(int com.wk.aop.OperationImpl.*(..))"/>
<aop:pointcut id="myPointcut2" expression="execution(* com.wk.aop.OperationImpl.print())"/>
</aop:config>
Advice(增强或者通知)
AOP在特定的切入点上执行的增强处理
前置通知
@Before
@Before
<bean id="myBeforeAdvice" class="com.wk.aop.MyBeforeAdvice"/><!--前置通知-->
后置通知
@After
@After
<bean id="myAfterAdvice" class="com.wk.aop.MyAfterAdvice"/> <!--后置通知-->
异常通知
@AfterThrowing
@AfterThrowing
<bean id="myThrowsAdvice" class="com.wk.aop.MyThrowsAdvice"/> <!--异常通知-->
环绕通知
@Around
@Around
<bean id="myMethodInterceptor" class="com.wk.aop.MyMethodInterceptor"/> <!--环绕通知-->
Target(目标对象)
引入中提到的目标类,也就是要被通知的对象。
也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。
而自己专注于业务本身的逻辑。
也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。
而自己专注于业务本身的逻辑。
<!--原始对象-->
<bean class="com.wk.aop.OperationImpl"/>
<bean class="com.wk.aop.OperationImpl"/>
Weaving(织入)
把切面应用到目标对象来创建新的代理对象的过程
动态代理
可以在不改变原来代码的情况下实现功能的增强
可以在不改变原来代码的情况下实现功能的增强
JDK动态代理
基于接口,默认使用
CGLIB代理
基于子类,在需要代理类而不是代理接口的时候,Spring会自动切换为使用CGLIB代理
切面、切点、通知三者结合起来用
0 条评论
下一页