Spring中两个重要特性是什么?
Spring中有两个非常重要的特性IOC和AOP,其中AOP是IOC功能的拓展
IOC:IOC是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spring 框架来管理。负责创建对象,使用依赖注入(dependency injection,DI)管理它们,将对 象集中起来,配置对象,管理对象的整个生命周期。
AOP:AOP模块用于为支持Spring应用程序面向切面的开发。AOP联盟提供了很多支持,这 样就确保了Spring和其他AOP框架的共通性。面向切面编程能够将那些与业务无关,却为 业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起 来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
IOC的好处有哪些?
1、IOC或依赖注入最小化应用程序代码量
2、它使测试应用程序变得容易,因为单元测试中不需要单例或JNDI查找机制。
3、以最小的代价和最少的干扰来促进松耦合。
4、IOC容器支持快速实例化和懒加载。
AOP是怎么实现的?
AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP 会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib 生成一个 被代理对象的子类来作为代理。
Spring中bean有哪些作用域?
singleton:Spring将bean定义的范围限定为每个Spring IOC容器只有一个单实 例。
prototype:单个bean定义有任意数量的对象实例。
request:作用域为一次http请求,该作用域仅在基于web的Spring ApplicationContext情形下有效。
session:作用域为HTTP Session,该作用域仅在基于web的Spring ApplicationContext情形下有效。
global-session:作用域为全局的HTTP session。该作用域也是仅在基于web的 Spring ApplicationContext情形下有效。
单例模式是线程安全的吗?
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
Spring中有哪些常见的注解?
@Component:用于指示类是组件。这些类用于自动注入,并在使用基于注解的 配置时配置为bean。
@Controller:是一种特定类型的组件,用于MVC应用程序,主要与 @RequestMapping注解一起使用。
@Repository:用于表示组件用作存储库和存储/检索/搜索数据的操作。我们可以 将此注解应用于DAO实现类。
@Service:用于指示类是服务层。
@Required:此注解简单地说明作用的bean属性必须在配置时通过bean定义中的显 式属性值或通过自动注入填充。如果作用的bean属性未填充,容器将抛出 BeanInitializationException
@ResponseBody:用于将对象作为response,通常用于将XML或JSON数据作为 response发送。
@PathVariable:用于将动态值从URI映射到处理方法参数。
@Autowired:对自动注入的位置和方式提供了更细粒度的控制。它可以用于在 setter方法上自动注入bean。就像@Required 注解一样,修饰setter方法、构造 器、属性或者具有任意名称和/或多个参数的PN方法。
@Qualifier:当有多个相同类型的bean并且只需要将一个bean自动注入时, @Qualifier注解与@Autowired注释一起使用,通过指定将连接哪个bean来消除歧 义。 @Scope:配置Spring bean的作用域。
@Configuration:表示Spring IOC容器可以将该类用作bean定义的源。 @ComponentScan:应用此注解时,将扫描包下的所有可用类。
@Bean:对于基于java的配置,用@Bean注解修饰的方法将返回一个在Spring应 用程序上下文中注册为Bean的对象。
用于配置切面和通知、@Aspect、@Before、@After、@Around@Pointcut等 的AspectJ注解。
Spring支持的事务管理类型?
编程式事务,在代码中硬编码。(不推荐使用)
声明式事务,在配置文件中配置(推荐使用)
声明式事务分两种:
1、基于XML的声明式事务
2、基于注解的声明式事务