Spring

Spring是一个开源的控制反转(Inversion of Control ,IOC)和面向切面(Aspect Oriented Programmin ,AOP)的容器框架.
IOC和AOP是它的两个重要特性。
依赖注入(Dependency Injection,DI)是控制反转的重要部分,它的主要目的是简化企业开发。
依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。

xml文件配置

bean标签

id属性是bean的唯一标识,用来获取此bean类的对象,
class属性是类的全限定名,不能是接口
scope默认是singleton单例模式,也可以设置成prototype多例,每次getBean获取的都是新的对象
lazy-init="default"默认在加载配置文件时创建所有的类对象,也可以设置为true加载配置文件时不创建对象,只有在使用时才创建
init-method=“init”,对象创建完成初始化地方法,只执行一次
destroy-method="desstroy"对象销毁调用的方法,只执行一次

property标签根据类中的各个属性名称初始化值

<bean id="Xxx" class="全限定名">
        <!-- 给bean中不同的属性初始化值 -->
        <property name="inValue" value="1"/>
        <property name="strValue" value="李四"/>
        <property name="arrayValue">
            <array>
                <value>张三</value>
                <value>李四</value>
                <value>王五</value>
            </array>
        </property>
        <property name="listValue">
            <list>
                <value>张三</value>
                <value>李四</value>
                <value>王五</value>
            </list>
        </property>
        <property name="setValue">
            <set>
                <value>张三</value>
                <value>李四</value>
                <value>王五</value>
            </set>
        </property>
        <property name="mapValue">
            <map>
                <entry key="1" value="张三"/>
                <entry key="2" value="李四"/>
                <entry key="3" value="王五"/>
            </map>
        </property>
        <property name="propValue">
            <props>
                <prop key="1">张三</prop>
                <prop key="2">李四</prop>
                <prop key="3">王五</prop>
            </props>
        </property>
    </bean>

使用
加载xml配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("/xml文件名.xml");
通过 .getBean("xml文件中设置的id名“)调用,有可通过 。getBean(类名.class)调用
User user = (User)context.getBean(“user”);
User user1 = context.getBean(User.class);

开启注解模式,使用注解需要开启注解
< context:annotation-config/>
配置组件包扫描,指定基本的包名称,自动扫描该报以及子包下面的所有类,
查找类上由注解@Component、@Controller、@Service、@Repository自动创建对象
<context:component-scan base-package=“com.entor.entity”/>

Spring注解

@Controller、@Service、@Repository、 @Component 作用在类上
作用:相当于配置文件中一个bean标签,默认的id属性名称是该类名的首字母小写格式,也可以指定名称
以上四个注解都是用在类上面,作用类似,主要区别是用来标识不同类型的对象
@Controller 注解用来标识处理客户端请求类
@Service 注解用来标识业务处理类
@Repository 注解用来标识数据访问层处理了
@Component 注解用来标识除了上面三个标识以外其他组件

@Resource 注解在属性上面,
作用:根据属性名称去配置文件中获取对应id名称的bean对象,找到之后赋值给该属性,如果找不到则根据属性类型去配置文件中查找,如果找到多个则报错,使用注解后可以省略get、set方法
@Autowired 注解用在属性上面,
作用:根据属性类型去配置文件查找对象,如果找到多个,在根据属性名称去配置文件中查找,如果找不到则报错
可以配合@Qualifier注解使用,指定名称去查找,如果找不到则报错,不会再根据属性名称去查找

AOP

静态代理(staticproxy)

代理类实现接口,在实现类方法中添加方法
缺点:接口发送改变,类也将发生改变重写

public class Proxy implements UserService{
    private UserService userService;
    public Proxy(UserService userService){
        this.userService=userService;
    }
    @Override
    public void delete() {
        check();
        userService.delete();
    }
    public void check(){
        System.out.println("权限检查");
    }
}

动态代理(jdkproxy)

可根据调用的对象、方法,动态实现代理
传入目标对象创建目标代理对象,目标对象必须 实现接口的类,目标对象没有实现接口类,无法代理
代理类实现InvocationHandler接口

/**
 * jdk动态代理,代理的目标对象必须要实现接口
 */
public class JDKProxy implements InvocationHandler {

    private Object targetOject;

    /**
     * 根据传入的目标对象创建代理对象
     * @param targetOject 目标对象
     * @return
     */
    public Object createProxy(Object targetOject){
        this.targetOject = targetOject;
        return Proxy.newProxyInstance(targetOject.getClass().getClassLoader(),
                targetOject.getClass().getInterfaces(),
                this);
    }

    /**
     *
     * @param o 代表动态代理对象
     * @param method 代表正在执行的方法
     * @param objects 代表调用目标方法时传入的实参
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        if (method.getName().equals("delete")){
            check();
        }

        Object result = method.invoke(this.targetOject, objects);
        return result;
    }
    public void check(){
        System.out.println("权限校验");
    }

}

cglib代理(cglibproxy)

在动态代理的基础上实现了无接口代理
一次只可以代理一个对象

public class CglibProxy implements MethodInterceptor {

    private Object tar;

    public Object createtar(Object tar){
        this.tar = tar;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.tar.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        if (method.getName().equals("giveMoney")){
            click1();
        }
        if (method.getName().equals("give")){
            click2();
        }
        Object invoke = method.invoke(this.tar, objects);
        return invoke;
    }
    private void click1(){
        System.out.println("交费成功!");
    }
    private void click2(){
        System.out.println("扫地完成!");
    }
}

aop

在cglib代理的基础是实现多代理

xml

通过xml配置文件实现代理

annotation

通过注解实习代理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值