一
注解
除了使用xml方式配置实现注入(管理对象和对象之间的关系)操作之外,还可以用Annotation来提高我们写代码的灵活性和效率。
annotation方式给我们提供了一个最重要的功能:扫描!component-scan(不扫描怎么知道你在哪个类加上了注解,提到注解就要想到扫描)
实例
1.Spring中要使用annotation,需要在配置文件中增加配置,如下是完整的applicationtext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-lazy-init="true" >
<context:component-scan base-package="com.bjsxt"></context:component-scan> <!-- context自动扫描com.bjsxt下的类 -->
<!--component-scan 组件扫描器,用了它后不用配置bean,spring会主动去搜索类,如果不用它,如果你写了类不配置bean,容器是找不到bean的,
起到了简化配置文件的作用。但有一点,加了扫描器后,spring的启动会变慢,因为会先去扫描类,在项目启动的时候会把IOC容器创建好。
有的项目启动得花一分钟,解决办法是在beans的开始标签中加 default-lazy-init="true",在用的时候再实例化类-->
</beans>
2.UserDao.java
@Component //把普通pojo实例化到IOC容器中,相当于在IOC容器中new的UserDao,和在xml中配置bean是一样的。
public class UserDao{
public UserDao(){
System.out.println("init.....");
}
public void add(){
System.out.println("add....");
}
}
3.UserAction.java
@Component //扫描的时候只会把这些带了注解的类扫描进来,加个括号是给它改名字,默认是以这个类名为名,@Component("ccc")
public class UserAction{
private UserDao userDao;
public UserDao getUserDao(){
return userDao;
}
@Resource(name="userDao")
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public String add(){
userDao.add();
return null;
}
}
哪个类想进入IOC容器,只需要在它的类名上加@Component,然后在它要建立的关系的方法上写@Resource(name="userDao"),如果你用的是set注入,就在set方法上加,要是你用的是构造器注入,就在构造器上加,就这么简单。用Annotation创建IOC容器的对象的方法就这句话就全讲明白了!
4.接下来测试
Test.java
public class Test{
public static void main(String[] args){
ApplicationContext ac = new ClassPathXmlApplicationContext(
new String[ ]{"ApplicatioinContext.xml"}
);
UserDao userDao = (UserDao) ac.getBean("userDao"); //虽然在xml中没有配置它,但是注解配置了,所以用getBean也是可以获取的。
}
}
执行下看能不能打印初始化中的init
—————————注解 end—————————————————————
IOC讲完啦,就这么简单,管理对象,new一下,给它赋值,建立关联。够了!
*******题外********
对象和对象之间的关系包括:
依赖:对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其它对象的调用关系
关联:对象之间一种引用关系,比如客户类与订单类之间的关系。这种关系通常使用类的属性表达。
聚合:表示has-a的关系,是一种不稳定的包含关系。聚合类不必对被聚合类负责。使用集合属性表达
********************************************************
二
AOP面向切面编程
核心思想是:弹性的设计,利用动态代理的底层实现,为层与层之间,动态植入代码。层和层之间有很多的调用关系。我们往里面植入代码,影响的是层和层之间的交流。
AOP是代码重用的最佳案例。真正达到了写一次用多次的效果。而且是可挺拔式的、插件式的。以前写程序时是要写个功能,需要到多个类里面去修改,删除时也要改动多个类。有了AOP就不用啦。为避免这种情况,AOP是现在大型项目中必备的。
AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面。AOP不是实现小功能的,它是用于实现公共设计代码,如权限、系统日志记录、安全控制、事务的管理。新手一般接触不到这方面的实现,或者是人家已经实现好了。AOP并不适合单一功能,所以叫面向切面编程。
一个请求来到服务器,会创建一个线程。这个线程会执行很多的方法,整个项目是由很多线程组成的。AOP是从业务流切入,加入功能,和代理很像。