spring AOP+IOC 回顾

问题:

1,什么是spring?

2,什么是IOC,它的原理是什么?

3,什么是AOP,它的原理是什么?

 

一,什么是spring?

定义:它是一个免费的开源框架,用来解决:业务逻辑层和其他各层的松耦合问题。

优点:免费,轻量,支持事物,支持IOC+AOP

组成:

 

Spring-Core:提供一个使用IOC创建bean并管理bean的容器

Spring-Context:是一个配置文件,向Spring框架提供上下文信息。提供的服务有:JNDI、EJB、电子邮件、国际化、校验和调度功能。

Spring-Aop:提供了对面向切面编程的丰富支持。例如:方法拦截器和切点

Spring-Dao:对传统的JDBC进行了抽象,并提供明性事务管理方法。

Spring-Web:Web模块建立于Content模块之上,提供了WEB开发的基础集成特性,便于集成WEB框架,如Struts、Webwork、tapest

Spring Web MVC:一个功能全面的MVC框架。

Spring-ORM:为主流的ORM框架提供了模板之类的辅助类,达成了一致的编程风格,如hibernate,mybatis

 

 二,spring IOC

IOC定义:inversion of control 是一种设计思想,指:创建对象控制权的转移,以前创建对象的主动权和创建时机是由自己把控的(new),而现在这种权力转移到IOC容器(使用反射进行创建)

描述:

       原来:new UserDao进行使用,使用后销毁。

       现在:IOC读取配置,将UserDao对象创建放入IOC容器,当你需要使用UserDao对象时,IOC容器提供对象给你进行使用

目标:1,实现对象创建和使用的解耦,2,对象的创建交给IOC容器后,使得程序员将重心聚焦到业务逻辑的实现上。

降低耦合:例如:现有A类调用B类和C类,B类和C类是接口D的实现,原有的方式A类中需要对B类和C类对象new出来后使用这就造成A,B,C三个类强耦合

如果引入IOC,B类和C类对象都交给IOC创建,A类只需要使用接口D引用来接收B和C类的对象,这样耦合变为了A和D的耦合。后期D接口的实现类变多了,耦合度也不会发生改变。

原理:

1,编写bean.xml配置;

2,程序启动时读取配置;

3,通过反射创建对象并放入IOC容器中;

4,使用时可以直接从容器中获取对象

 

 

 

 

 

 

补充链接:https://www.cnblogs.com/xdp-gacl/p/4249939.html

 

三,spring AOP

 

 

 

 

 

 

2,代理模式:

分类:静态代理,动态代理

案例说明:用户向房东租房,用户通过中介向房东租房

 

 

代码实现:host房东类和rentAgent租房中介类实现了rent租房接口的出租方法,rentAgent将host作为自己的属性,来完成对它的代理操作。

 

动态代理相比静态代理的优点:静态代理,如果接口中能够有几个方法就需要写对应的几个代理方法,动态代理将所有方法都统一成一个方法,使用method参数进行回调

 

 静态代理实现:

package com.jianjiang;

import lombok.AllArgsConstructor;
import lombok.Data;

public class Test
{
public static void main(String[] args)
{
User user = new User("小明");
Host host = new Host("房东");
RentAgent agent = new RentAgent(host);

//未使用代理
host.rentHousing(user.getName());
//使用代理,对原有的方法进行了增强
agent.rentHousing(user.getName());
}
}
interface Rent
{
void rentHousing(String name);
}
@Data
@AllArgsConstructor
class Host implements Rent
{
private String name;
@Override
public void rentHousing(String name)
{
System.out.println("将房子出租给"+name);
}
}
@Data
@AllArgsConstructor
class RentAgent implements Rent
{
private Host host;
@Override
public void rentHousing(String name)
{
reviewHousing(name);
host.rentHousing(name);
signContract(name);
}
private void reviewHousing(String name)
{
System.out.println("带"+name+"去看房");
}
private void signContract(String name)
{
System.out.println("与"+name+"签合同");
}
}
@Data
@AllArgsConstructor
class User
{
private String name;
}

动态代理实现

import lombok.AllArgsConstructor;
import lombok.Data;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.logging.Handler;

public class Test
{
    public static void main(String[] args)
    {
        User user = new User("小明");
        Host host = new Host("房东");
        RentAgentHandler handler = new RentAgentHandler(host);

        Rent agent = (Rent) handler.getAgent();
        agent.rentHousing(user.getName());
    }
}

interface Rent
{
    void rentHousing(String name);
}

@Data
@AllArgsConstructor
class Host implements Rent
{
    private String name;
    @Override
    public void rentHousing(String name)
    {
        System.out.println("将房子出租给"+name);
    }
}

@Data
@AllArgsConstructor
class RentAgentHandler implements InvocationHandler
{
    private Object target;

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        reviewHousing(args[0].toString());
        Object invoke = method.invoke(target, args);
        signContract(args[0].toString());
        return invoke;
    }

    public Object getAgent()
    {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    private void reviewHousing(String name)
    {
        System.out.println("带"+name+"去看房");
    }
    private void signContract(String name)
    {
        System.out.println("与"+name+"签合同");
    }
}

@Data
@AllArgsConstructor
class User
{
    private String name;
}

  

 

posted @ 2022-06-10 22:52  陈建江  阅读(22)  评论(0编辑  收藏  举报