做网站可以找设计公司吗,做运营必看的网站,网站数据库建设access,上海科技网络公司一、什么是Spring#xff1f; Spring是一个开源框架#xff0c;可以降低开发复杂度#xff0c;提高开发效率#xff0c;轻量级低耦合的框架。由于Spring的分层架构#xff0c;可以自己选择整合其他组件#xff0c;灵活性高
二、什么是IOC#xff1f; IOC 叫做控制反转 Spring是一个开源框架可以降低开发复杂度提高开发效率轻量级低耦合的框架。由于Spring的分层架构可以自己选择整合其他组件灵活性高
二、什么是IOC IOC 叫做控制反转指的是通过Spring来管理对象的创建、配置和生命周期这样相当于把控制权交给了Spring不需要人工来管理对象之间复杂的依赖关系这样做的好处就是解耦。在Spring里面主要提供了 BeanFactory 和 ApplicationContext 两种 IOC 容器通过他们来实现对 Bean 的管理。 BeanFactory采用延迟加载机制初始化时间短适用于资源有限或需要延迟加载的场景。ApplicationContext在启动时预先加载所有Bean对象初始化时间较长但在应用运行时能够更快地获取Bean对象并提供了更多的功能和特性适用于大多数应用场景。 BeanFactoryBean工厂顶层接口 BeanFactory是Spring框架中最基本的IOC容器接口。它是一种轻量级的容器采用延迟加载懒加载机制即在需要获取Bean时才进行实例化和初始化。由于延迟加载的特性BeanFactory的初始化时间较短节约了系统资源。BeanFactory提供了基本的IOC功能包括Bean的实例化、配置、装配以及管理Bean之间的依赖关系。 ApplicationContext ApplicationContext是BeanFactory的子接口也是Spring框架中更高级、功能更丰富的IOC容器。与BeanFactory相比ApplicationContext在启动时会预先加载所有Bean对象进行实例化和初始化。这使得ApplicationContext在应用运行时能够更快地获取Bean对象提高了应用的性能。除了BeanFactory的功能外ApplicationContext还提供了更多的特性如国际化支持、事件传播、资源加载、AOP等。
三、什么是AOP AOP即面向切面编程可以在不改变原有代码的基础上对目标方法进行无侵入式增强。AOP 基于动态代理的方式实现如果是实现了接口的话就会使用 JDK 动态代理反之则使用 CGLIB 代理Spring中 AOP 的应用主要体现在 事务、日志、异常处理等方面通过在代码的前后做一些增强处理可以实现对业务逻辑的隔离提高代码的模块化能力同时也是解耦。
四、JDK动态代理和CGliB代理区别有哪些
Spring提供了两种方式来实现动态代理JDK动态代理和CGLIB代理。
JDK动态代理JDK动态代理是基于接口的代理通过反射机制动态生成代理类。当目标对象实现了接口时Spring会使用JDK动态代理来创建代理对象。JDK动态代理通过Proxy类和InvocationHandler接口实现。在运行时通过Proxy类的newProxyInstance()方法生成代理对象同时传入一个实现了InvocationHandler接口的代理处理器对象用于处理代理对象的方法调用。
// 定义UserService接口包含addUser方法
public interface UserService {void addUser();
}// UserServiceImpl实现了UserService接口实现了addUser方法
public class UserServiceImpl implements UserService {Overridepublic void addUser() {System.out.println(Add user);}
}// MyInvocationHandler实现了JDK动态代理的InvocationHandler接口用于对目标方法进行增强
public class MyInvocationHandler implements InvocationHandler {private Object target; // 目标对象public MyInvocationHandler(Object target) {this.target target; // 初始化目标对象}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(Before method call); // 在方法调用前输出信息Object result method.invoke(target, args); // 调用目标对象的原始方法System.out.println(After method call); // 在方法调用后输出信息return result;}
}public class Main {public static void main(String[] args) {UserService target new UserServiceImpl(); // 创建目标对象MyInvocationHandler handler new MyInvocationHandler(target); // 创建代理处理器UserService proxy (UserService) Proxy.newProxyInstance(target.getClass().getClassLoader(), // 类加载器target.getClass().getInterfaces(), // 目标对象实现的接口handler // 代理处理器);proxy.addUser(); // 调用代理对象的方法实际会执行增强后的逻辑}
}
CGLIB代理CGLIB代理是基于继承的代理当目标对象没有实现接口时Spring会使用CGLIB代理来创建代理对象。CGLIB代理通过字节码技术生成目标对象的子类并重写父类的方法来实现增强功能。
// UserService类定义了一个简单的方法 addUser
public class UserService {public void addUser() {System.out.println(Add user);}
}// MyMethodInterceptor实现了CGLIB的MethodInterceptor接口用于对目标方法进行增强
public class MyMethodInterceptor implements MethodInterceptor {Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println(Before method call); // 在方法调用前输出信息Object result proxy.invokeSuper(obj, args); // 调用被代理对象的原始方法System.out.println(After method call); // 在方法调用后输出信息return result;}
}public class Main {public static void main(String[] args) {Enhancer enhancer new Enhancer(); // 创建Enhancer对象用于生成代理类enhancer.setSuperclass(UserService.class); // 设置父类为UserService生成的代理类会继承UserServiceenhancer.setCallback(new MyMethodInterceptor()); // 设置方法拦截器用于对目标方法进行增强UserService proxy (UserService) enhancer.create(); // 创建代理对象proxy.addUser(); // 调用代理对象的方法实际会执行增强后的逻辑}
}
五、Spring中有哪些设计模式
1.代理模式 所谓代理是指它与被代理对象实现了相同的接口客户端必须通过代理才能与被代理的目标类进行交互而代理一般在交互的过程中交互前后进行某些特定的处理比如在调用这个方法前做前置处理调用这个方法后做后置处理。代理又分为静态代理和动态代理两种方式Spring 的 AOP 采用的是动态代理的方式Spring 通过动态代理对类进行方法级别的切面增强动态生成目标对象的代理类并在代理类的方法中设置拦截器通过执行拦截器中的逻辑增强了代理方法的功能从而实现 AOP。
2.单例模式 单例模式是指一个类在整个系统运行过程中只允许产生一个实例。在Spring中Bean 可以被定义为两种模式Prototype多例和Singleton单例Spring 默认是单例模式。那么Spring是如何实现单例模式的呢答案是通过单例注册表的方式具体来说就是使用了HashMap
public class DefaultSingletonBeanRegistry {//使用了线程安全容器ConcurrentHashMap保存各种单实例对象private final Map singletonObjects new ConcurrentHashMap;protected Object getSingleton(String beanName) {//先到HashMap中拿ObjectObject singletonObject singletonObjects.get(beanName);//如果没拿到通过反射创建一个对象实例并添加到HashMap中if (singletonObject null) {singletonObjects.put(beanName,Class.forName(beanName).newInstance());}//返回对象实例return singletonObjects.get(beanName);}
}
3.模板模式 主要是一些对数据库操作的类用到比如 JdbcTemplate、JpaTemplate因为查询数据库的建立连接、执行查询、关闭连接几个过程非常适用于模板方法。