赞
踩
答:Spring一款开源的轻量级的Java应用框架,它的主旨是为了简化Java企业级应用开发。Spring提供的核心功能主要是 IoC 和 AOP。并且它提供了全面的基础设施支持,可以很方便地对数据库进行访问、集成第三方组件(任务、调度、缓存等)。使开发人员能更能专注业务逻辑开发,而无需处理繁琐的底层细节。
Spring官方:Spring makes it easy to create Java enterprise applications. It provides everything you need to embrace the Java language in an enterprise environment.
答:Spring的模块主要有:
答:IoC即控制反转的意思,它是一种创建和获取对象的技术思想,依赖注入(DI)是实现这种技术的一种方式。传统开发过程中,我们需要通过new关键字来创建对象。使用IoC思想开发方式的话,我们不通过new关键字创建对象,而是通过IoC容器来帮我们实例化对象。 通过IoC的方式,可以大大降低对象之间的耦合度。
答:依赖注入是一种设计模式,依赖注入用于实现控制反转一种方式。在依赖注入模式下,依赖对象的创建和管理不再由使用该对象的类负责,而是由外部容器(Spring IoC容器)负责,并在需要的时候将这些依赖对象注入到需要他们的类中。实现依赖注入的方式主要有三种,如下
构造方法注入:通过对象的构造函数来注入依赖。
public class MyClass {
private MyDependency myDependency;
public MyClass(MyDependency myDependency) {
this.myDependency = myDependency;
}
}
setter方法注入:通过对象的Setter方法来注入依赖。
public class MyClass {
private MyDependency myDependency;
public void setMyDependency(MyDependency myDependency) {
this.myDependency = myDependency;
}
}
接口注入:通过对象实现一个特定的接口来注入依赖。
public interface DependencyInjector {
void injectDependency(MyClass myClass);
}
public class MyClass implements DependencyInjector {
private MyDependency myDependency;
@Override
public void injectDependency(MyDependency myDependency) {
this.myDependency = myDependency;
}
}
答:AOP是面向切面编程的意思,用于将横切关注点与业务逻辑代码分离,横切关注点通常指的是分散在多个类中的公共行为,如日志记录、事物管理、权限管理等。通过把这些横切关注点进行封装成独立的模块形成切面,并在运行时动态地将他们植入到应用程序中的普通业务逻辑中。通过Spring AOP可以实现代码的复用和解耦,从而提高代码的可维护性和可扩展性等。
// 日志注解 @Target({ElementType.PARAMETER,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Log { /** * 描述 */ String description() default ""; /** * 方法类型 INSERT DELETE UPDATE OTHER */ MethodType methodType() default MethodType.OTHER; } // 日志切面 @Component @Aspect public class LogAspect { // 切入点,所有被 Log 注解标注的方法 @Pointcut("@annotation(com.zouhuu.annotation.Log)") public void webLog() { } /** * 环绕通知 */ @Around("webLog()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { // 省略具体的处理逻辑 } // 省略其他代码 } /** * 通过注解实现日志记录 */ public class MyController() { @Log(description = "method1",methodType = MethodType.INSERT) public CommonResponse<Object> method1() { // 业务逻辑 xxService.method1(); // 省略具体的业务处理逻辑 return CommonResponse.success(); } }
答:简单来说Spring Bean是指被Spring IoC容器所管理的对象。Spring容器负责Bean的创建、初始化、配置以及销毁。我们可以通过XML文件或注解等方式去定义Bean。Bean可以是任意类型的Java对象,比如数据访问对象DAO、业务服务对象等。
Bean的生命周期可以分为定义、属性设置、初始化、生存、销毁这五个阶段。
答:Bean的作用域定义了其生命周期内的可见范围,Spring中Bean的作用域默认都是单例的(Singleton)。
答:在Spring中代理是一种设计模式,主要用于实现诸如AOP(面向切面编程)这样的功能。代理模式允许在不修改原有对象的前提下,通过创建一个代理对象来包装原始对象,从而增加额外的功能,如日志记录、权限检查、事务管理等。
答:循环依赖是指两个Bean或多个Bean相互依赖,从而形成循环。如当 Spring 创建 A 之后,发现 A 依赖了 B ,又去创建 B,B 依赖了 A ,又去创建 A。
class A {
// 使用了 B
private B b;
}
class B {
// 使用了 A
private A a;
}
为了解决这个问题,Spring引入了三级缓存的机制来解决循环依赖。如果发生循环依赖的话,就去 三级缓存 singletonFactories 中拿到三级缓存中存储的 ObjectFactory 并调用它的 getObject() 方法来获取这个循环依赖对象的前期暴露对象(虽然还没初始化完成,但是可以拿到该对象在堆中的存储地址了),并且将这个前期暴露对象放到二级缓存中,这样在循环依赖时,就不会重复初始化了。
答:MVC是一种设计模式,它提供了一种分离业务逻辑,用户界面,控制流程方式。Spring MVC是实现MVC模式的框架,它可以帮我们以更简洁和模块化的方式构建Web应用。它包含三个核心注解,如下所示:
Spring MVC的工作原理:
答:Spring为事物提供了编程式和声明式两种方式来管理事务。通过事务可以确保数据操作的原子性、一致性、隔离性和持久性(ACID)。在Spring中,主要围绕PlatformTransactionManager(事务管理器接口,用于管理和协调事务的生命周期和执行),TransactionDefinition(事务定义接口,定义事物的传播行为和隔离级别),TransactionStatus(事务状态接口)来管理事务。
编程式事务管理:通过TransactionTemplate或者TransactionManager手动管理事务
@Service public class UserService { @Autowired private UserRepository userRepository; @Autowired private PlatformTransactionManager transactionManager; public void createUser(User user) { TransactionDefinition def = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(def); try { userRepository.save(user); transactionManager.commit(status); } catch (Exception e) { transactionManager.rollback(status); throw e; } } }
声明式事务管理:主要是通过@Transactional注解的形式
@Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void createUser(User user) { userRepository.save(user); } @Transactional(readOnly = true) public User getUser(Long id) { return userRepository.findById(id).orElse(null); } }
答:拦截器和过滤器都是Java Web开发中常用的技术,用于对请求和响应进行处理。可以用于实现身份验证、日志记录、数据转换等功能。
拦截器:拦截器是Spring中一种基于AOP思想的组件,其生命周期由Spring容器所管理。用于请求到达控制器之前和请求完成之后进行处理。主要用于处理业务逻辑相关的,如权限验证等处理。
/** * 实现一个拦截器需要实现HandlerInterceptor接口 */ public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 处理请求前 System.out.println("Pre-handle"); return true; // 返回false将终止请求处理 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 处理请求后但在视图渲染之前 System.out.println("Post-handle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 完成请求处理后的清理工作 System.out.println("After completion"); } } /** * 在Spring中注册和配置拦截器 */ @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); } }
过滤器:属于Servlet规范等一部分,用于在请求到达目标资源(如Servlet、JSP页面)之前和响应返回给客户端之后进行预处理和后处理。主要用于处理通用的,与Servlet规范相关的逻辑,如字符编码设置,安全检查等。
/** * 实现Filter接口 */ public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化代码 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 处理请求前 System.out.println("Request received at filter"); chain.doFilter(request, response); // 处理请求后 System.out.println("Response returned at filter"); } @Override public void destroy() { // 销毁代码 } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。