1. 什么是 Spring 框架?
Spring中文翻译过来是春天的意思,被称为J2EE的春天,是一个开源的轻量级的Java开发框架, 具有控制反转(IoC)和面向切面(AOP)两大核心。Java Spring框架通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
Spring框架不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从Spring中受益。Spring框架还是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。
1)IOC 控制反转
对象创建责任的反转,在Spring中BeanFactory是IOC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。XmlBeanFactory实现BeanFactory接口,通过获取xml配置文件数据,组成应用对象及对象间的依赖关系。
Spring中有3中注入方式,一种是set注入,另一种是注解注入,另一种是构造方法注入。
2)AOP面向切面编程
AOP是指纵向的编程,比如两个业务,业务1和业务2都需要一个共同的操作,与其往每个业务中都添加同样的代码,通过写一遍代码,让两个业务共同使用这段代码。
Spring中面向切面编程的实现有两种方式,一种是动态代理,一种是CGLIB,动态代理必须要提供接口,而CGLIB实现是由=有继承。
2. Spring框架的设计目标,设计理念,和核心是什么
Spring设计目标:Spring为开发者提供一个一站式轻量级应用开发平台;
Spring设计理念:在JavaEE开发中,支持POJO和JavaBean开发方式,使应用面向接口开发,充分支持OO(面向对象)设计方法;Spring通过IoC容器实现对象耦合关系的管理,并实现依赖反转,将对象之间的依赖关系交给IoC容器,实现解耦;
Spring框架的核心:IoC容器和AOP模块。通过IoC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。
IoC让相互协作的组件保持松散的耦合,而AOP编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。
3. Spring 框架中使用了哪些设计模式?
Spring框架中使用大量的设计模式,下面列举比较有代表性的:
代理模式
AOP能够将那些与业务无关(事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度有利于可拓展性和可维护性。
单例模式
Spring中bean的默认作用域是单例模式,在Spring配置文件中定义bean默认为单例模式。
模板方法模式
模板方法模式是一种行为设计模式,用来解决代码重复的问题,如RestTemplate、JmsTemplate、JpaTemplate。
包装器设计模式
Spring根据不同的业务访问不同的数据库,能够动态切换不同的数据源。
观察者模式
定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。
Spring事件驱动模型就是观察者模式很经典的一个应用。
工厂模式
Spring使用工厂模式通过BeanFactory、ApplicationContext创建bean对象。
4. Spring 依赖注入有几种实现方式?
1)Constructor构造器注入:通过将@Autowired注解放在构造器上来完成构造器注入,默认构造器参数通过类型自动装配。
public class Test { private UserInterface user; @Autowired private Test(UserInterface user) { this.user = user; }
}
2)Field接口注入:通过将@Autowired注解放在构造器上来完成接口注入。
@Autowired //接口注入
private IUserService userService;
3)Setter方法参数注入:通过将@Autowired注解放在方法上来完成方法参数注入。
public class Test {private User user;@Autowiredpublic void setUser(User user) { this.user = user; } public String getuser() { return user; }
}
5. Spring 中常用的注解包含哪些?
1)声明bean的注解
@Component 组件,没有明确的角色
@Service 在业务逻辑层使用(service层)
@Repository 在数据访问层使用(dao层)
@Controller 在展现层使用,控制器的声明(C*上使用)
2)注入bean的注解
@Autowired:由Spring提供
@Inject:由JSR-330提供
@Resource:由JSR-250提供
都可以注解在set方法和属性上,推荐注解在属性上(一目了然,少写代码)。
3)java配置类相关注解
@Configuration 声明当前类为配置类,相当于xml形式的Spring配置(类上使用),其中内部组合了@Component注解,表明这个类是一个bean(类上使用)
@Bean 注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式(方法上使用)
@ComponentScan 用于对Component进行扫描,相当于xml中的(类上使用)
@WishlyConfiguration 为@Configuration与@ComponentScan的组合注解,可以替代这两个注解
4)切面(AOP)相关注解
Spring支持AspectJ的注解式切面编程。
@Aspect 声明一个切面(类上使用)
使用@After、@Before、@Around定义建言(advice),可直接将拦截规则(切点)作为参数。
@After 在方法执行之后执行(方法上使用)
@Before 在方法执行之前执行(方法上使用)