Spring的IOC 和 AOP

本文介绍了SpringBoot的优势,如简化Spring配置、内置Tomcat支持等,并深入探讨了Spring框架的核心特性IOC和AOP,包括它们的目的、实现原理及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring框架相关:

 

1.为什么使用springboot?

  1. 使用springboot,带有spring框架的优秀特性,IOC和aop。
  2. 大量简化了spring的配置过程,无需使用xml配置开发过程,Bean的注入,使用注解加上一个application.properties就可以完成大部分的配置工作。
  3. 整合第三方框架的时候 也不需要过多的配置,只需要在maven中导入相关的jar包就可以了。
  4. springboot内置tomcat 一键启动,无需整合服务器。当然也可以使用外置的tomcat.(打成war包,移除内部tomcat依赖)
  5. 运行方式是jar包的方式,在linux上 java -jar xxx 就可以运行。
  6. 对于微服务,小型项目很实用,便于开发。

2.Spring框架的特点

  1. IOC和AOP

IOC(控制反转)

将创建对象的过程由程序代码控制交给了spring容器,由spring来控制对象的生命周期。

目的:

1.解耦 降低了类之间的耦合,利于维护。(不是在运行的时候在对象中所求另外一个依靠的对象,而是通过xml配置或者注解,在运行期间直接将依赖的对象创建好 注入进来)所以又可以叫依赖注入。

2.灵活性更好。

IOC的实现原理:工厂模式和java的反射机制。

不加反射的工厂模式:

interface fruit{
    public abstract void eat();
} 
class Apple implements fruit{
     public void eat(){
         System.out.println("Apple");
     }
} 
class Orange implements fruit{
     public void eat(){
         System.out.println("Orange");
     }
}
//构造工厂类
//也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了
class Factory{
     public static fruit getInstance(String fruitName){
         fruit f=null;
         if("Apple".equals(fruitName)){
             f=new Apple();
         }
         if("Orange".equals(fruitName)){
             f=new Orange();
         }
         return f;
     }
}
class hello{
     public static void main(String[] a){
         fruit f=Factory.getInstance("Orange");
         f.eat();
     }
}

此时,我们可以通过工厂模式传入一个类名参数得到对应的对象,但是如果还想要得到没有的对象,就必须修改工厂模式。

带有反射的工厂模式:


class Factory{
    public static fruit getInstance(String ClassName){
        fruit f=null;
        try{
            f=(fruit)Class.forName(ClassName).newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return f;
    }
}

加入了反射的工厂模式,每次只需要增加子类而不需要修改工厂模式。

现在就算我们添加任意多个子类的时候,工厂类都不需要修改。使用反射机制实现的工厂模式可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类,所以我们通过属性文件的形式配置所需要的子类。

 IOC中最基本的技术就是“反射(Reflection)”编程,通俗来讲就是根据给出的类名(字符串方式)来动态地生成对象,这种编程方式可以让对象在生成时才被决定到底是哪一种对象。只是在Spring中要生产的对象都在配置文件中给出定义,目的就是提高灵活性和可维护性。

IOC的注意点:

1.使用IOC 也会使得系统变得复杂

2.IOC生成对象的方式是反射,运行效率有一定的损耗。

3.大量的配置工作。

 

AOP面向切面编程

是对oop面向对象编程的补充,oop引入的是对曾层次结构,程序的运行可以看成一个柱体自上而下的过程,对象就是这个柱体,但是一些公共的行为,业务行为之外的行为,例如打印日志,分布在代码中会导致代码的冗余度和复杂度变高。

AOP技术就是将这些非业务代码封装到一个可重用的模块,便于操作和维护。

在某一个行为的前后(切入点),打入这些模块就可以完成这些操作。

AOP 的实现:依靠java 的动态代理 和cglib的动态代理。

区别:jdk动态代理必须要实现一个接口的类生成代理,CGlib利用的是继承的方式生成代理类。

实现原理:通过对代理类中方法的增强,加上反射,达到AOP的功能。

代理类中拥有实际类中所有的方法并且还有我们所需要的打印日志等功能代码,aop就是利用了反射动态调用,当需要日志功能时,就调用代理类中的方法,当不需要的时候,就调用实际类的方法。

 

Spring注解:

组件类注解:

@Component :标准一个普通的spring Bean类。 
@Repository:标注一个DAO组件类。 
@Service:标注一个业务逻辑组件类。 
@Controller:标注一个控制器组件类。 

装配Bean注解:

@Autowire 可用于为类的属性、构造器、方法进行注值 

 

SpringMVC常用注解:

  • @Controller :表明该类会作为与前端作交互的控制层组件,通过服务接口定义的提供访问应用程序的一种行为,解释用户的输入,将其转换成一个模型然后将试图呈献给用户。
  • @RequestMapping : 这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!
  • @PathVariable : 该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)。
  • @RequestBody : @RequestBody是指方法参数应该被绑定到HTTP请求Body上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值