spring就是一个bean的容器
所谓bean,就是需要get,set的一些java实体,例如User
通过spring把bean加载到容器中,当需要使用bean时候,不需要去new 一个对象,直接先在spring-cfg
中去配置他的bean,然后通过依赖注入的方式去调用。
在配置文件spring-cfg
中需要有一些约束条件,让的配置更加规范,就需要使用到spring-beans
这个jar包
每个bean,都往spring-cfg
,那么配置文件又大又臃肿,所以,spring通过注解注入的方式就不用去配置文件中配置bean信息,把注解直接写在bean上就可以了,常用的注解有@Service
Controller
Component
使用了这些注解的bean必须还要被扫描到,才能自动装载到spring容器中,那么spring-cfg
中就需要配置一个专门包扫描的东西,它受约束于spring-context
这个东西就是<context:component-scan>
以上都是讲怎么把bean加载到spring中的,但要是需要使用某个bean还去new还去通过反射getBean那就太low了,直接使用注解@Autowired
有了spring-beans
和spring-context
和@Autowired
就可以先把bean加载到spring容器中,当使用的时候不用new对象,直接@Autowired
即可。
疑问,为什么
@Autowired
总是用在接口上,?
AOP
当需要使用数据库时候,正常的顺序是,打开事务,打开连接,sql语句,执行查询插入删除,关闭连接,关闭事务等等。
有了切面编程,把数据库操作,拦截下来,把事务什么的都干好,我们只需要专心去sql语句,执行查询插入删除。
他可以拦截某些方法执行前后,做一些操作。可以使用注解,也可以使用XML
使用注解的方式就是spring-cfg
再加一个spring-aop
的约束,标签是<aop:aspectj-autoproxy>
一个切面类首先需要有@Aspect
来声明这是一个切面,还需要加上@Component
来声明这是一个组件,加载到spring容器中。这切面类中,使用的注解常有@Pointcut
@Before
@After
@AfterReturning
@Around
使用XML方法:
aop的原理有两种实现方式,第一种,JDK提供的 Proxy (代理)和 InvocationHandler (调用处理)。使用这种方式,必须要实现接口,这种方式,优势是,使用反射创建对象,创建效率高。
aop的原理有两种实现方式,第二种,cglib基于子类基于继承,没有接口的时候,只能用这个,优势是执行效率高