Spring03

Spring03

使用注解开发

在spring4之后,要使用注解的开发,必须要保证aop的包存在。重要

  1. bean
  2. 属性如何注入
@Component
//等价于<bean id="user" class="com.kunn.pojo.User/>"
public class User {
    @Value("WRK")
    public String name;
}

或者
@Component
//等价于<bean id="user" class="com.kunn.pojo.User/>"
public class User {
    
    public String name;
    @Value("abc")
    public void setName(String name) {
        this.name = name;
    }
}
  1. 衍生的注解

    @Component 有几个衍生注解,我们在web开发中会按照mvc三层架构分层

  • dao --> @Repository

  • service --> @Service

  • controller --> @Controller

    这四个注解功能都是一样的,都代表将类装配到容器中。

  1. 自动装配
@Autowired:自动装配,通过类型、名字,默认是byType。如果不能唯一的装配上属性,则配合@Qualifier(value = "")使用
@Nullable:字段标记了这个属性,表示可以为null
@Resource:自动装配,通过类型、名字。默认是byName,找不到再使用byType
  1. 作用域

@Scope

  1. 小结

    xml与注解:

  • xml更加万能,适用于任何场面,维护简单方便
  • 注解:不是自己的类使用不了,维护相对复杂

xml与注解的最佳实践:xml用来管理bean,注解只用来属性的注入

使用Java的方式配置Spring

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

等价与

<beans>
    <bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>

JavaConfig是Spring的子项目,在Spring4之后成为了一个核心功能。

有多个@Configuration的类时,在其中一个加上@Import

@Configuration
@Import(AppConfig2.class)
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

代理模式

代理模式是Spring AOP的底层。重要

代理模式分类:

  • 静态代理
  • 动态代理

在这里插入图片描述

3.1 静态代理

角色分析:

  • 抽象角色:一般使用接口或者抽象类实现
  • 真实角色:被代理的角色
  • 代理角色:代理真实角色,代理真实角色后,一般会做附属操作
  • 客户:访问代理对象的人

好处:

  • 可以是真实角色的操作更加纯粹,不用关心一些公共业务
  • 公共业务交给代理角色,实现角色的分工
  • 公共业务发生扩展的时候方便集中管理

缺点:
一个真实角色就会产生一个代理角色,代码量翻倍,开发效率变低。

3.2 动态代理

动态代理底层是反射。

  • 动态代理和静态代理角色一样
  • 动态代理的代理类是动态生成的,不是直接写好的
  • 动态代理分为两大类:
    • 基于接口的动态代理—JDK动态代理
    • 基于类的动态代理 —cglib
    • Java字节码实现:javassist

需要理解两个类:Proxy、InvocationHandler

public class ProxyInvocationHandler implements InvocationHandler {

    private Rent rent;

    public void setRent(Rent rent) {
        this.rent = rent;
    }

    public Object getProxy(){
        //这里也可以在Client的main方法中生成proxy类。
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object res = method.invoke(rent, args);
        return res;
    }
}

public class Client {
    public static void main(String[] args) {
        //方法一
        Host host = new Host();

        ProxyInvocationHandler handler = new ProxyInvocationHandler();
        handler.setRent(host);
        Rent proxy = (Rent) handler.getProxy();
        proxy.rent();
        //方法二
        Rent host = new Host();

        ProxyInvocationHandler handler = new ProxyInvocationHandler();
        handler.setRent(host);
        Rent proxy = (Rent) Proxy.newProxyInstance(handler.getClass().getClassLoader(), host.getClass().getInterfaces(), handler);
        proxy.rent();
    }
}



这里主要就是两个类,一是生成代理类,然后是实现InvocationHandler的接口。

好处:

  • 可以是真实角色的操作更加纯粹,不用关心一些公共业务
  • 公共业务交给代理角色,实现角色的分工
  • 公共业务发生扩展的时候方便集中管理
  • 一个动态代理类代理是一个接口,一般对应一类业务
  • 一个动态代理类可以代理多个类,只要实现了同一个接口即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值