文章目录
- 什么是Spring框架?Spring框架有哪些主要模块?
- Spring有几种配置方式?
- Spring框架中的单例Beans是线程安全的么?
- Spring 框架中都用到了哪些设计模式?★★★
- Spring AOP在实际项目中的应用★★★
- 阐述一下Bean的生命周期?
- Spring 中有哪些方式可以把 Bean 注入到 IOC 容器?
- SpringData有了解么吗?
- Spring的IOC你了解哪些?★★★
- @Resource 和 @Autowired 的区别
- Spring的AOP你了解哪些?★★★
什么是Spring框架?Spring框架有哪些主要模块?
Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。
Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。
Spring有几种配置方式?
将Spring配置到应用开发中有以下三种方式:
- 基于XML的配置
- 基于注解的配置
- 基于Java的配置
Spring框架中的单例Beans是线程安全的么?
Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Servie类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。
最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。
Spring 框架中都用到了哪些设计模式?★★★
Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的:
-
代理模式—在AOP和remoting中被用的比较多。
-
单例模式—在spring配置文件中定义的bean默认为单例模式。
-
模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
-
工厂模式—BeanFactory用来创建对象的实例。
Spring AOP在实际项目中的应用★★★
权限管理、表单验证、事务管理、信息过滤、拦截器、过滤器、页面转发等等。
阐述一下Bean的生命周期?
在Spring框架中,Bean的生命周期通常包括以下几个阶段:
1. 实例化Bean对象:当Spring容器需要一个Bean时,会调用Bean类的构造方法创建一个新的Bean实例。
2. Bean属性赋值:Spring容器会在创建Bean实例后,将Bean类中的属性值赋给实例变量。
3. Bean初始化:Spring容器会在Bean实例化后,调用@PostConstruct注解标注的方法对Bean进行初始化操作。这个方法可以有多个,并且是按照声明顺序执行的。
4. Bean使用:Spring容器会在需要使用Bean的时候,调用getBean方法获取Bean实例。此时,Bean已经被创建并初始化完毕,可以直接使用了。
5. Bean销毁:当Spring容器不再需要Bean时,会调用destroy方法销毁Bean实例。在销毁之前,Spring容器会先调用deallocate方法释放Bean占用的资源。如果在Bean中使用了ThreadLocal等线程本地变量,则会在线程结束时自动清理。
下面是一个简单的示例,展示了Spring中Bean的生命周期:
public class MyBean {
private int count;
public MyBean(int count) {
this.count = count;
}
@PostConstruct
public void init() {
System.out.println("Initializing MyBean, count=" + count);
}
public void doSomething() {
System.out.println("Doing something with MyBean, count=" + count);
}
}
@Configuration
public class AppConfig {
@Bean
public MyBean myBean(int count) {
return new MyBean(count);
}
}
public class App {
public static void main(String[] args) throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyBean bean = (MyBean) context.getBean("myBean");
bean.init(); // Initializing MyBean, count=0
bean.doSomething(); // Doing something with MyBean, count=0
context.close(); // 关闭应用程序上下文,销毁所有bean实例和资源
}
}
// applicationContext.xml文件内容如下:
<bean id="myBean" class="com.example.MyBean">
<property name="count">0</property>
</bean>
Spring 中有哪些方式可以把 Bean 注入到 IOC 容器?
在Spring中,有以下几种方式可以把Bean注入到IOC容器:
1. 构造函数注入:通过在Bean类的构造函数上使用@Autowired注解,将需要注入的Bean作为参数传递给构造函数。
2. Setter方法注入:通过在setter方法上使用@Autowired注解,将需要注入的Bean作为参数传递给setter方法。
3. 字段注入:通过在Bean类的属性上使用@Autowired注解,将需要注入的Bean作为属性值直接赋值。
4. @Resource注解:使用@Resource注解标注一个静态方法或类,该方法或类会自动装配一个指定类型的Bean实例。
5. @ComponentScan注解:使用@ComponentScan注解扫描指定包下的所有类,并将被扫描到的类自动装配到IOC容器中。
6. @Import注解:使用@Import注解导入其他配置文件中定义的Bean,这些Bean会被自动装配到IOC容器中。
7. @Qualifier注解:使用@Qualifier注解指定需要装配的具体Bean的名称,以便在多个相同类型的Bean之间进行选择。
SpringData有了解么吗?
1. Spring Data JPA Repositories:提供了一些高级功能,如查询构造器、分页、排序等,使得开发人员可以更加方便地进行JPA数据访问。
2. Spring Data REST Repositories:提供了一些高级功能,如RESTful风格的接口、JSON序列化和反序列化等,使得开发人员可以更加方便地进行RESTful数据访问。
3. Spring Data Elasticsearch Repositories:提供了一些高级功能,如支持Elasticsearch的索引和搜索、集成Elasticsearch模板等,使得开发人员可以更加方便地进行Elasticsearch数据访问。
4. Spring Data MongoDB:提供了一些高级功能,如支持MongoDB的索引和搜索、集成MongoDB模板等,使得开发人员可以更加方便地进行MongoDB数据访问。
总之,Spring Data提供了多种数据访问技术的支持,可以根据不同的需求选择合适的技术进行数据访问。同时,Spring Data还提供了很多高级功能和扩展性,可以帮助开发人员更加方便地进行数据访问和管理。
Spring的IOC你了解哪些?★★★
Spring IoC (Inversion of Control) 是一种依赖注入(Dependency Injection,DI)的实现方式,它可以解决 Java 应用程序中组件之间的耦合问题。
在 Spring IoC 中,组件不再直接依赖于其他组件,而是通过容器(IoC Container)来管理它们的依赖关系。当需要使用一个组件时,容器会自动将该组件注入到调用它的代码中,从而实现了解耦和松散耦合。
Spring IoC 主要由以下几个部分组成:
- 容器(IoC Container):负责管理应用程序中的所有组件,并将它们组合在一起以创建完整的应用程序。Spring IoC 默认使用的是 Tomcat 作为 IoC Container。
- 配置文件(Configuration File):用于定义应用程序中所有组件的依赖关系。Spring IoC 通过 XML 或 Java 配置文件来实现配置。
- 注解(Annotation):用于描述组件之间的依赖关系。Spring IoC 支持多种注解,如 @Autowired、@Inject 等。
- 代理(Proxy):Spring IoC 在运行时动态地创建一个代理对象,用于管理组件之间的依赖关系。代理对象可以拦截方法调用,并在调用前或调用后执行一些额外的操作。
总之,Spring IoC 可以大大简化 Java 应用程序的开发过程,提高代码的可维护性和可测试性。
@Resource 和 @Autowired 的区别
@Resource
和 @Autowired
都是Spring框架中用于自动装配Bean的注解,它们的作用是一样的,都是将一个或多个Bean注入到目标对象中。
不过,它们之间还是有一些区别的:
1. `@Resource` 是Java EE标准中的注解,而`@Autowired` 是Spring框架中的注解。因此,如果你使用的是Java EE标准规范,那么你可以使用`@Resource`注解;如果你使用的是Spring框架,那么你可以使用`@Autowired`注解。
2. `@Resource`注解可以同时指定多个Bean进行注入,而`@Autowired`注解只能指定一个Bean进行注入。例如:
@Resource
private UserService userService;
@Autowired
private UserService userService; // 只指定了一个UserService Bean
3. `@Resource`注解可以指定Bean的名称,而`@Autowired`注解不能直接指定Bean的名称。如果需要指定Bean的名称,可以通过`@Qualifier`注解来指定。例如:
@Resource(name="userService")
private UserService userService;
@Autowired
@Qualifier("userService")
private UserService userService; // 通过@Qualifier指定了bean的名称为"userService"
总之,@Resource
和@Autowired
注解的主要区别在于它们的来源和使用方式。如果你使用的是Java EE标准规范,那么你可以使用@Resource
注解;如果你使用的是Spring框架,那么你可以使用@Autowired
注解。无论使用哪种注解,都需要根据实际情况选择合适的方式进行Bean的注入。
Spring的AOP你了解哪些?★★★
Spring AOP (Aspect-Oriented Programming) 是一种面向切面编程(Aspect-Oriented Programming,AOP)的实现方式,它可以解决 Java 应用程序中横切关注点(Cross-Cutting Concerns)的问题。
在 Spring AOP 中,我们可以将横切关注点从业务逻辑代码中分离出来,通过定义切面(Aspect)来统一处理。切面是一个包含一系列通知(Advice)的模块化单元,通知可以在程序执行的不同阶段执行,如方法调用前、方法调用后、异常处理等。
Spring AOP 主要由以下几个部分组成:
1. 切面(Aspect):定义一个或多个通知,用于描述横切关注点的处理逻辑。
2. 实现接口(Interface):定义切面接口,并实现其中的方法。
3. 织入(Weaving):将切面应用到目标对象中,使其具有横切关注点的处理能力。Spring AOP 支持两种织入方式,即基于代理的织入和基于 CGLIB 的织入。
4. AOP 配置文件(Aspect Configuration File):用于定义切面的声明和切点表达式等信息。Spring AOP 通过 XML 或注解方式来实现配置。
总之,Spring AOP 可以大大简化 Java 应用程序的开发过程,提高代码的可维护性和可测试性。