- spring中Bean与java中的对象之间的区别:
Bean是spring基于java对象定义的名称,spring中的bean是javabean的延伸。一个完整的Bean是对一个对象进行属性赋值后产生的,且有spring容器进行管理。
-
初始化方式:
javabean初始化是通过new的方式调用指定的构造方法产生;
springbean初始化是通过spring容器产生,在javabean的基础上会对相应的属性进行赋值。 -
生命周期:
javabean的生命周期有jvm进行控制,在需要使用的时候产生,不使用的时候由jvm进行回收;
springbean的生命周期由spring容器进行控制,在spring容器创建的时候初始化完成,且在容器销毁时对bean进行回收。 -
使用方式:
javabean在使用的时候需要通过new方式创建一个新的对象进行使用;
springbean 在使用的时候只需要通过spring容器中获取对象进行使用。
2.spring中Bean的生命周期:
3.spring中Bean的创建过程 -
初始化对象(java普通对象):
通过调用类的构造方法进行初始化对象,spring使用“推断构造方法”的方式进行判断该使用哪一个构造方法,如果类中没有定义显式的构造方法或者显式定义了无参的构造方法时spring将使用默认的无参构造方法;如果类中没有显式定义无参的构造方法且仅有一个有参的构造方法时spring将使用定义的有参构造方法;如果类中存在多个构造方法时可通过@Autowired注解指定spring将使用的构造方法,没有@Autowired注解时将报错。
注意:如果调用的是有参的构造方法进行初始化对象时,spring会先根据参数类型(byType)从spring容器中匹配对应参数的值,如果找出对个值则再根据参数名称(byName)去匹配,找不到或者找到多个则会报错。 -
依赖注入(给对象填充属性) :需要在类中通过@Autowired注解标识那些属性是需要spring进行填充的。
-
Aware回调:判断类是否实现了BeanNameAware接口、BeanClassLoaderAware接口、BeanFactoryAware接口,如果实现可在调用setBeanName、setBeanClassLoader、setBeanFactory方法。
-
调用类中@PostConstruct标识的方法,可通过该方法执行一些自定义的逻辑去改变对象中属性的值,例如可查询数据库将真实需要的属性赋值给对象。
-
判断类是否实现了InitializingBean接口,实现了则调用afterPropertiesSet方法,该方法作用于@PostConstruct类似。
-
判断类中是否存在AOP,存在则根据该对象通过CGLIB动态代理生成一个代理对象,代理对象中加入了AOP切面方法的逻辑。
-
将生成的对象(存在AOP时该对象为代理对象,不存在AOP时该对象为普通对象)加入spring容器中管理,加入容器时需要判断当前Bean是单例Bean(Sington)则加入容器中管理,是原型Bean(protype)则不加入,每次获取是则需要重新生成一个Bean实例。
4.spring中Bean的获取:
使用applicationContext的getBean方法进行获取,如果该Bean中存在AOP,则通过该方法获取的Bean为代理对象(该代理对象中属性不存在值);如果不存在AOP则Bean为真实的对象(属性值存在)。
- spring事务管理:spring事务依赖于AOP实现
- 判断当前执行的方法是否存在@Transactional注解
- 如果存在,则利用事务管理器(TransactionMananger)新建一个数据库连接
- 修改数据库连接的autocommit为false
- 执行target.test(),执行程序员所写的业务逻辑代码,也就是执行sql
- 执行完了之后如果没有出现异常,则提交,否则回滚
- Spring事务是否会失效的判断标准:某个加了@Transactional注解的方法被调用时,要判断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效。