框架

本文深入探讨了Spring框架的依赖注入原理、Bean的生命周期、AOP概念及Spring MVC的工作流程。同时,对比了Spring MVC与Spring Boot的区别,解析了Spring Boot的自动配置机制。此外,还详细介绍了MyBatis的半ORM特性及其与Hibernate的区别,以及#{}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.springMvc的基本原理和工作流程
在服务器启动时,先通过web.xml构建DispatcherServlet,构建springmvc容器,平且初始化一些组建例如
handlerMapping和handlerAdapter(处理器适配器)。
如果用户发送的请求符合servlet-mapping的映射路径则把请求转发到DispatcherServlet处理,
根据请求(request)从容器中获取handlerMapping实例再把根据Handler找到对应的HandlerAdapter
平且通过找到的处理器适配器执行handler后返回ModelAndView
在将ModelAndView交由视图解析器等到view返回到页面。
2.springmvc和springboot的区别
springmvc是基于servlet的一个mvc框架,需要自己去配置
springboot视为了简化项目搭建,“约定优于配置”,减少需要配置的东西,并且提供整合包

3.spring的基本原理
Spring的核心机制:依赖注入。
不管是依赖注入(Dependency Injection)还是控制反转(Inversion of Conctrol),其含义完全相同:
当某个java实例(调用者)需要调用另一个java实例(被调用者)时,传统情况下,通过调用者来创建被调用者的实例,通常通过new来创建,
而在依赖注入的模式下创建被调用者的工作不再由调用者来完成,因此称之为"控制反转";创建被调用者实例的工作通常由Spring来完成,
然后注入调用者,所以也称之为"依赖注入"。
Bean的生命周期:
①singleton与prototype的区别:
singleton:Spring可以精确的知道该Bean何时被创建、初始化、销毁。对于singleton作用域的Bean,每次客户端请求Spring容器总会返回一个共享的实例。
prototype:Spring容器仅仅负责创建Bean,当容器创建了Bean的实例后,Bean实例完全交给客户端代码管理,容器不在跟踪其生命周期。
每次客户端请求prototype作用域的Bean,都会为他创建一个新的实例,
②AOP的基本概念:
AOP框架不与特定的代码耦合.下面是一些面向切面编程的术语:
切面(Aspect):业务流程运行到某个特定的步骤,也就是一个应用运行的关注点,关注点可能横切多个对象,所以常常也被称为横切关注点。
连接点(Joinpoint):程序执行过程明确的点,如方法的调用、异常的抛出,Spring AOP中连接点总是方法的调用。
增强处理(Advice):AOP框架在特定的切入点执行的增强处理,处理有around、before和After等类型。
切入点(Pointcut):可以插入增强处理的连接点,简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变
4.springboot的基本原理
主要是由@SpringBootApplication注解下的三个注解起决定性作用
@SpringBootConfiguration、@EnableConfiguration、@ComponentScan
(1)@SpringBootConfiguration使用说明该类是一个配置类 和 xml配置文件一个概念
(2)@ComponentScan使用会去自动扫描指定包下的Bean,springboot默认扫描与启动类同一级的目录包下的类
(3)@EnableConfiguration

//主要依赖与@AutoConfigurationPackage与@Import注解实现自动配置功能
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
**@AutoConfigurationPackage**
**@Import({AutoConfigurationImportSelector.class})**
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    Class<?>[] exclude() default {};
    String[] excludeName() default {};
}
//以mybatis的spring.factories为例
//是以键值对的形式存放自动配置类的类路径
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

//然后在通过AutoConfigurationImportSelector类中的getCandidateConfigurations方法找到jar包中的META-INF/spring.factories文件
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = **SpringFactoriesLoader.loadFactoryNames**(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }
//org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration的部分内容
@Configuration
//判断当前项目是否有该类
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) 
@ConditionalOnBean({DataSource.class})
//加载配置类文件
@EnableConfigurationProperties({MybatisProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class MybatisAutoConfiguration {
    private static final Logger logger = LoggerFactory.getLogger(MybatisAutoConfiguration.class);
    private final MybatisProperties properties;
    private final Interceptor[] interceptors;
    private final ResourceLoader resourceLoader;
    private final DatabaseIdProvider databaseIdProvider;
    private final List<ConfigurationCustomizer> configurationCustomizers;

    public MybatisAutoConfiguration(MybatisProperties properties, ObjectProvider<Interceptor[]> interceptorsProvider, ResourceLoader resourceLoader, ObjectProvider<DatabaseIdProvider> databaseIdProvider, ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) {
        this.properties = properties;
        this.interceptors = (Interceptor[])interceptorsProvider.getIfAvailable();
        this.resourceLoader = resourceLoader;
        this.databaseIdProvider = (DatabaseIdProvider)databaseIdProvider.getIfAvailable();
        this.configurationCustomizers = (List)configurationCustomizersProvider.getIfAvailable();
    }

    @PostConstruct
    public void checkConfigFileExists() {
        if (this.properties.isCheckConfigLocation() && StringUtils.hasText(this.properties.getConfigLocation())) {
            Resource resource = this.resourceLoader.getResource(this.properties.getConfigLocation());
            Assert.state(resource.exists(), "Cannot find config location: " + resource + " (please add config file or check your Mybatis configuration)");
        }

    }

    @Bean
    @ConditionalOnMissingBean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        factory.setVfs(SpringBootVFS.class);
        if (StringUtils.hasText(this.properties.getConfigLocation())) {
            factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
        }

        org.apache.ibatis.session.Configuration configuration = this.properties.getConfiguration();
        if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
            configuration = new org.apache.ibatis.session.Configuration();
        }

        if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
            Iterator var4 = this.configurationCustomizers.iterator();

            while(var4.hasNext()) {
                ConfigurationCustomizer customizer = (ConfigurationCustomizer)var4.next();
                customizer.customize(configuration);
            }
        }

        factory.setConfiguration(configuration);
        if (this.properties.getConfigurationProperties() != null) {
            factory.setConfigurationProperties(this.properties.getConfigurationProperties());
        }

        if (!ObjectUtils.isEmpty(this.interceptors)) {
            factory.setPlugins(this.interceptors);
        }

        if (this.databaseIdProvider != null) {
            factory.setDatabaseIdProvider(this.databaseIdProvider);
        }

        if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
            factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
        }

        if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
            factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
        }

        if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
            factory.setMapperLocations(this.properties.resolveMapperLocations());
        }

        return factory.getObject();
    }
    }

4.mybatis基本总结
(1)是一个半ORM(对象关系映射)的框架,因为他在处理关联关系的时候需要自己写sql语句,而Hibernate则通过一对多,一对一,多对多注解进行解释关系。
(2)#{}与${}的区别
#{}是代表预编译语句中的?占位符,预编译就是数据库驱动先把sql和参数发送到DBMS,进行sql的预编译处理。然后就可以直接执行sql。
${}是代表sql语句字符串拼接,容易出现sql注入问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值