对刚学习完spring框架或曾学过但是忘记了的人, 回看此篇博客会有帮助
以下代码全在Maven工程下编写:
创建测试使用spring框架的类, 使用Junit时, 可以选择手动创建ApplicationContext对象
private ApplicationContext applicationContext;
accountService = applicationContext.getBean("accountService",
AccountService.class);
一个简单的使用spring案例:
从中可以看出, 我们使用spring框架后, 要创建对象的时候, 无需再次使用new, 这样直接交付给spring框架, 让它帮我们去做这件事情, 这样可以降低耦合程度
也可以通过使用@RunWith()注解来使用spring的junit整合
从而免去成员变量applicationContext
创建bean的注解:
@Controller 用于控制层上的类
@Service 用于业务层操作的类
@Repository 用于持久层操作的类
@Component 除三层架构外的类
准确来说, 这四个注解放在什么类上都行, 而创建这四个不同的注解是为了区分类的层次
四个注解作用相同, 都是让spring使用反射创建实例化对象, 并将其加入到IOC容器中
查看注解的源代码后发现, 都有这四个注解都有value属性
value属性注释翻译过来就是:
该值可能表示建议使用逻辑组件名称,在自动检测到组件的情况下,将其转换为Spring bean
不给value赋值时, bean的id值是当前类名且首字母改小写.
@Bean注解也是创建bean, 不过这个注解只能放在方法和注解上
方法上使用该注解: 表示将方法的返回值作为bean对象并将其加入到IOC容器中
@Bean注解的源码表明其和上面四个注解不同
依赖注入(DI)
当创建一个实例对象的时候, 如果这个类有一个或多个属性(或者叫做成员变量)需要赋值, 这时, 可以让spring让帮我们做这件事情.
可见, 使用Autowired和Qualifier可以实现依赖注入, 方法参数或者成员变量均可, 且Qualifier可以实现特定标记的bean的注入
在上述案例中使用的@ComponentScan注解和xml文件中的
作用是等效的, 都是通知spring要扫描的包
动态代理
使用Proxy类的newProxyInstance()方法生产一个动态代理对象, 可以对对象的方法进行增强和改造(在不改变原对象的代码基础上)
使用示例:
测试结果:
之所以要介绍这个动态代理, 是因为和spring提供的AOP有关
五种类型的通知
前置
后置
异常
最终
环绕. 前四种通知其实可以被环绕通知承包
类似于这样,
其中异常通知在catch块中, 最终通知在finally块中
假设有如下通知类
运行结果
从上图可以看出, 在未更改实现类方法的代码的情况下, 我们能对方法进行改造.