Spring的IOC与Aop

一、IOC

1. 什么是 IOC?
1.1 控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
1.2 使用 IOC 目的:为了耦合度降低

2. IOC 底层原理

2.1 xml 解析、工厂模式、反射

2.2 IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂 

3. Spring 提供 IOC 容器的实现方式

Spring 提供 IOC 容器实现两种方式(两个接口):

3.1 BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用
* 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
3.2 ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人
员进行使用
* 加载配置文件时候就会把在配置文件对象进行创建
4. 什么是 Bean 管理?

Bean 管理指的是两个操作: Spring 创建对象、Spirng 注入属性 

Bean 管理操作有两种方式:基于 xml 配置文件方式实现、基于注解方式实现

5. IOC 操作 Bean 管理(基于 xml 方式)
5.1 第一种注入方式:使用 set 方法进行注入

5.2 第二种注入方式:使用有参数构造进行注入

5.3 p 名称空间注入(了解)

6. IOC 操作 Bean 管理(FactoryBean)  

Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)  

6.1 普通 bean:在配置文件中定义 bean 类型就是返回类型

6.2 工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样
第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型
public class MyBean implements FactoryBean<Course> {
 //定义返回 bean
 @Override
 public Course getObject() throws Exception {
     Course course = new Course();
     course.setCname("abc");
     return course;
 }
 @Override
 public Class<?> getObjectType() {
     return null;
 }
 @Override
 public boolean isSingleton() {
     return false;
 } 
}

<bean id="myBean" class="com.atguigu.spring5.factorybean.MyBean"></bean>

@Test
public void test3() {
 ApplicationContext context =
 new ClassPathXmlApplicationContext("bean3.xml");
 Course course = context.getBean("myBean", Course.class);
 System.out.println(course);
}

7. bean 生命周期

(1)通过构造器创建 bean 实例(无参数构造)
(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
(3)调用 bean 的初始化的方法(需要进行配置初始化的方法)
(4)bean 可以使用了(对象获取到了)
(5)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
public class Orders {
 //无参数构造
 public Orders() {
     System.out.println("第一步 执行无参数构造创建 bean 实例");
 }
 private String oname;
 public void setOname(String oname) {
     this.oname = oname;
     System.out.println("第二步 调用 set 方法设置属性值");
 }
 //创建执行的初始化的方法
 public void initMethod() {
     System.out.println("第三步 执行初始化的方法");
 }
 //创建执行的销毁的方法
 public void destroyMethod() {
     System.out.println("第五步 执行销毁的方法");
 } 
}

<bean id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
 <property name="oname" value="手机"></property>
</bean>

 @Test
 public void testBean3() {
    // ApplicationContext context =
    // new ClassPathXmlApplicationContext("bean4.xml");
     ClassPathXmlApplicationContext context =
     new ClassPathXmlApplicationContext("bean4.xml");
     Orders orders = context.getBean("orders", Orders.class);
     System.out.println("第四步 获取创建 bean 实例对象");
     System.out.println(orders);
     //手动让 bean 实例销
     context.close();
 }

8.IOC 操作 Bean 管理(基于注解方式)

8.1 什么是注解
(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值..)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的:简化 xml 配置
8.2 Spring 针对 Bean 管理中创建对象提供注解
(1)@Component
(2)@Service
(3)@Controller
(4)@Repository
* 上面四个注解功能是一样的,都可以用来创建 bean 实例
8.3 基于注解方式实现属性注入
(1)@Autowired:默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。如果想使用名称装配可以结合@Qualifier注解进行使用。
(2)@Qualifier:根据名称进行注入
(3)@Resource:默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找。如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
(4)@Value:注入普通类型属性

二、 Aop

1. 什么是 AOP
1.1 面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得
业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
1.2 通俗描述:不通过修改源代码方式,在主干功能里面添加新功能
2. 底层原理
AOP 底层使用动态代理 ,有两种情况动态代理:
第一种 有接口情况,使用 JDK 动态代理
第二种 没有接口情况,使用 CGLIB 动态代理
3. Aop术语
连接点:类中哪些方法可以被增强,这些方法成为连接点;
切入点:实际被增强的方法,成为切入点;
通知:实际增强的逻辑部分,成为通知
通知分为五种:前置通知,后置通知,环绕通知,异常通知,最终通知
切面:把通知应用到切入点的过程
4. 应用
4.1 Spring 框架一般都是基于 AspectJ 实现 AOP 操作,AspectJ 不是 Spring 组成部分,独立 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使用,进行 AOP 操作
4.2 基于 AspectJ 实现 AOP 操作 :基于 xml 配置文件实现、基于注解方式实现(使用)
4.3 切入点表达式:
作用:知道对哪个类里面的哪个方法进行增强
语法结构: execution([权限修饰符] [返回类型] [类全路径] [方法名称]([参数列表]) )
举例 1:对 com.kk.dao.BookDao 类里面的 add 进行增强
execution(* com.kk.dao.BookDao.add(..))
举例 2:对 com.kk.dao.BookDao 类里面的所有的方法进行增强
execution(* com.kk.dao.BookDao.* (..))
举例 3:对 com.kk.dao 包里面所有类,类里面所有方法进行增强
execution(* com.kk.dao.*.* (..))
4.4 例子
使用注解创建 User 和 UserProxy 对象
被增强的类:

增强的类:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值