Spring03
使用注解开发
在spring4之后,要使用注解的开发,必须要保证aop的包存在。重要
- bean
- 属性如何注入
@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;
}
}
-
衍生的注解
@Component 有几个衍生注解,我们在web开发中会按照mvc三层架构分层
-
dao --> @Repository
-
service --> @Service
-
controller --> @Controller
这四个注解功能都是一样的,都代表将类装配到容器中。
- 自动装配
@Autowired:自动装配,通过类型、名字,默认是byType。如果不能唯一的装配上属性,则配合@Qualifier(value = "")使用
@Nullable:字段标记了这个属性,表示可以为null
@Resource:自动装配,通过类型、名字。默认是byName,找不到再使用byType
- 作用域
@Scope
-
小结
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的接口。
好处:
- 可以是真实角色的操作更加纯粹,不用关心一些公共业务
- 公共业务交给代理角色,实现角色的分工
- 公共业务发生扩展的时候方便集中管理
- 一个动态代理类代理是一个接口,一般对应一类业务
- 一个动态代理类可以代理多个类,只要实现了同一个接口即可