爆破专栏丨SpringBoot2(4),2024年最新2024大厂网络安全面试真题集锦

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

然后再编写第2个数据库配置类,读取ds2中的数据库信息。

**package** com.yyg.boot.config.properties;

**import** lombok.Data;
**import** org.springframework.boot.context.properties.ConfigurationProperties;
**import** org.springframework.stereotype.Component;

/**
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/4/3
 * **@Description** db4数据源配置类
 */
@ConfigurationProperties(prefix = "spring.datasource.ds2")
@Component("ds2Properties")
@Data
**public** **class** **Ds2Properties** {

    **private** String url;

    **private** String username;

    **private** String password;

    **private** String driverClassName;

}

5. 注册数据源

接下来我们在一个类中同时注册2个数据源就可以了,注意我们就是在这个配置类中分别关联加载2个数据源。

**package** com.yyg.boot.config;

**import** org.springframework.beans.factory.annotation.Qualifier;
**import** org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
**import** org.springframework.boot.context.properties.ConfigurationProperties;
**import** org.springframework.context.annotation.Bean;
**import** org.springframework.context.annotation.Configuration;
**import** org.springframework.context.annotation.Primary;

**import** javax.sql.DataSource;

/**
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/4/3
 * **@Description** 数据源的配置类
 */
@Configuration
**public** **class** **DataSourceRegisterConfig** {

    /**
     * 主数据源配置 ds1数据源
     */
    @Primary
    @Bean(name = "ds1Properties")
    @ConfigurationProperties(prefix = "spring.datasource.ds1")
    **public** DataSourceProperties **ds1DataSourceProperties**() {
        **return** **new** DataSourceProperties();
    }

    /**
     * 主数据源 ds1数据源
     */
    @Primary
    @Bean(name = "ds1DataSource")
    **public** DataSource **ds1DataSource**(@Qualifier("ds1Properties") DataSourceProperties dataSourceProperties) {
        //HikariDataSource","org.apache.tomcat.jdbc.pool.DataSource", "org.apache.commons.dbcp2.BasicDataSource
        **return** dataSourceProperties.initializeDataSourceBuilder().build();
    }

    /**
     * 第二个ds2数据源配置
     */
    @Bean(name = "ds2Properties")
    @ConfigurationProperties(prefix = "spring.datasource.ds2")
    **public** DataSourceProperties **ds2DataSourceProperties**() {
        **return** **new** DataSourceProperties();
    }

    /**
     * 第二个ds2数据源
     */
    @Bean("ds2DataSource")
    **public** DataSource **ds2DataSource**(@Qualifier("ds2Properties") DataSourceProperties dataSourceProperties) {
        **return** dataSourceProperties.initializeDataSourceBuilder().build();
    }

}

6. 配置数据源、连接工厂、事务管理器、扫描dao目录

配置完2个数据源之后,我们还要利用事务管理器分别关联2个数据源。这里要注意合理的使用@Primary注解!

6.1 配置第一个数据源管理器

在这个数据源管理器中关联第1个数据源。

**package** com.yyg.boot.config;

**import** org.springframework.beans.factory.annotation.Autowired;
**import** org.springframework.beans.factory.annotation.Qualifier;
**import** org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
**import** org.springframework.context.annotation.Bean;
**import** org.springframework.context.annotation.Configuration;
**import** org.springframework.context.annotation.Primary;
**import** org.springframework.data.jpa.repository.config.EnableJpaRepositories;
**import** org.springframework.orm.jpa.JpaTransactionManager;
**import** org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
**import** org.springframework.transaction.PlatformTransactionManager;
**import** org.springframework.transaction.annotation.EnableTransactionManagement;

**import** javax.sql.DataSource;

/**
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/4/3
 * **@Description** 配置数据源、连接工厂、事务管理器、dao目录
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "managerFactory1", // 配置连接工厂
        transactionManagerRef = "transactionManager1", // 配置事物管理器
        basePackages = {"com.yyg.boot.dao.db01"} // 设置dao所在位置

)
**public** **class** **ManagerFactory01Config** {

    /**
     * 配置数据源,连接第1个数据源
     */
    @Autowired
    @Qualifier("ds1DataSource")
    **private** DataSource ds1DataSource;

    @Primary
    @Bean(name = "managerFactory1")
    **public** LocalContainerEntityManagerFactoryBean **buildEntityManagerFactory1**(EntityManagerFactoryBuilder builder) {
        **return** builder
                // 设置数据源
                .dataSource(ds1DataSource)
                //设置实体类所在位置.扫描所有带有 @Entity 注解的类
                .packages("com.yyg.boot.entity")
                // Spring会将EntityManagerFactory注入到Repository之中.有了 EntityManagerFactory之后,
                // Repository就能用它来创建 EntityManager 了,然后 EntityManager 就可以针对数据库执行操作
                .persistenceUnit("ds1PersistenceUnit")
                .build();

    }

    /**
     * 配置事务管理器
     */
    @Bean(name = "transactionManager1")
    **public** PlatformTransactionManager **transactionManagerDatabase1**(EntityManagerFactoryBuilder builder) {
        **return** **new** JpaTransactionManager(buildEntityManagerFactory1(builder).getObject());
    }

}

6.2 配置第2个数据源管理器

在这个数据源管理器中关联第2个数据源。

**package** com.yyg.boot.config;

**import** org.springframework.beans.factory.annotation.Autowired;
**import** org.springframework.beans.factory.annotation.Qualifier;
**import** org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
**import** org.springframework.context.annotation.Bean;
**import** org.springframework.context.annotation.Configuration;
**import** org.springframework.context.annotation.Primary;
**import** org.springframework.data.jpa.repository.config.EnableJpaRepositories;
**import** org.springframework.orm.jpa.JpaTransactionManager;
**import** org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
**import** org.springframework.transaction.PlatformTransactionManager;
**import** org.springframework.transaction.annotation.EnableTransactionManagement;

**import** javax.sql.DataSource;

/**
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/4/3
 * **@Description** 配置数据源、连接工厂、事务管理器、dao目录
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "managerFactory2", // 配置连接工厂
        transactionManagerRef = "transactionManager2", // 配置事物管理器
        basePackages = {"com.yyg.boot.dao.db02"} // 设置dao所在位置

)
**public** **class** **ManagerFactory02Config** {

    /**
     * 配置数据源,连接第2个数据源
     */
    @Autowired
    @Qualifier("ds2DataSource")
    **private** DataSource ds2DataSource;

    @Bean(name = "managerFactory2")
    **public** LocalContainerEntityManagerFactoryBean **buildEntityManagerFactory2**(EntityManagerFactoryBuilder builder) {
        **return** builder
                // 设置数据源
                .dataSource(ds2DataSource)
                //设置实体类所在位置.扫描所有带有 @Entity 注解的类
                .packages("com.yyg.boot.entity")
                // Spring会将EntityManagerFactory注入到Repository之中.有了 EntityManagerFactory之后,
                // Repository就能用它来创建 EntityManager 了,然后 EntityManager 就可以针对数据库执行操作
                .persistenceUnit("ds2PersistenceUnit")
                .build();

    }

    /**
     * 配置事务管理器
     */
    @Bean(name = "transactionManager2")
    **public** PlatformTransactionManager **transactionManagerDatabase1**(EntityManagerFactoryBuilder builder) {
        **return** **new** JpaTransactionManager(buildEntityManagerFactory2(builder).getObject());
    }

}

7. 创建数据源类型

这里我利用ThreadLocal来确保线程的安全性,这样每个线程之间就不会相互影响。

**package** com.yyg.boot.datasource;

**import** lombok.extern.slf4j.Slf4j;

/**
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/4/7
 * **@Description** 数据源类型
 */
@Slf4j
**public** **class** **DataSourceType** {

    **public** **enum** SourceType {
        /**
         * 用户数据源
         */
        DS_USER,
        /**
         * 商品数据源
         */
        DS_SHOP
    }

    /**
     * 使用ThreadLocal保证线程安全
     */
    **private** **static** **final** ThreadLocal<SourceType> TYPES = **new** ThreadLocal<>();

    /**
     * 往当前线程里设置数据源类型
     */
    **public** **static** **void** **setDataSourceType**(SourceType dataSourceType) {
        **if** (dataSourceType == **null**) {
            **throw** **new** NullPointerException();
        }
        log.warn("[设置当前数据源为]:" + dataSourceType);
        TYPES.set(dataSourceType);
    }

    /**
     * 获取数据源类型
     */
    **public** **static** SourceType **getDataSourceType**() {
        SourceType dataSourceType = TYPES.get() == **null** ? SourceType.DS_USER : TYPES.get();
        log.warn("[当前数据源的类型为]:" + dataSourceType);
        **return** dataSourceType;
    }

    /**
     * 清空数据类型
     */
    **public** **static** **void** **removeDataSourceType**() {
        TYPES.remove();
    }

}

8. 定义动态数据源

定义一个动态数据源,继承AbstractRoutingDataSource 抽象类,并重写determineCurrentLookupKey()方法。

AbstractRoutingDataSource这个类是实现多数据源的关键,作用是动态切换数据源。

在该类中有一个target Data Sources集合,该集合是Abstract Routing DataSource的一个map类型的属性,其中key表示每个数据源的名字,value为每个数据源。

然后根据determineCurrentLookupKey()这个方法获取当前数据源在map中的key值,然后determineTargetDataSource()方法中动态获取当前数据源,如果当前数据源不存且默认数据源也不存在时就会抛出异常。

**package** com.yyg.boot.datasource;

**import** org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/4/7
 * **@Description** 动态切换数据源
 */
**public** **class** **DynamicDataSource** **extends** **AbstractRoutingDataSource** {

    @Override
    **protected** Object **determineCurrentLookupKey**() {
        **return** DataSourceType.getDataSourceType();
    }

}

9. 配置多个数据源

在这里进行多数据源配置。

**package** com.yyg.boot.datasource;

**import** org.springframework.beans.factory.annotation.Qualifier;
**import** org.springframework.boot.context.properties.ConfigurationProperties;
**import** org.springframework.boot.jdbc.DataSourceBuilder;
**import** org.springframework.context.annotation.Bean;
**import** org.springframework.context.annotation.Configuration;
**import** org.springframework.context.annotation.Primary;
**import** org.springframework.core.io.support.PathMatchingResourcePatternResolver;

**import** javax.sql.DataSource;
**import** java.util.HashMap;
**import** java.util.Map;

/**
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/4/7
 * **@Description** 多数据源配置
 */
@Configuration
**public** **class** **DynamicDataSourceConfig** {

    @Bean(name = "dynamicDataSource")
    **public** DynamicDataSource **dynamicDataSource**(@Qualifier("ds1DataSource") DataSource ds1DataSource,
                                        @**Qualifier**("ds2DataSource") DataSource ds2DataSource) {
        Map<Object, Object> targetDataSource = **new** HashMap<>();
        targetDataSource.put(DataSourceType.SourceType.DS_SHOP, ds1DataSource);
        targetDataSource.put(DataSourceType.SourceType.DS_USER, ds2DataSource);
        DynamicDataSource dataSource = **new** DynamicDataSource();
        dataSource.setTargetDataSources(targetDataSource);
        dataSource.setDefaultTargetDataSource(ds2DataSource);
        **return** dataSource;
    }

}

10. 定义AOP切面

在这里编写AOP切面类,通@Before注解配置前置通知方法。

**package** com.yyg.boot.datasource;

**import** lombok.extern.slf4j.Slf4j;
**import** org.aspectj.lang.annotation.Aspect;
**import** org.aspectj.lang.annotation.Before;
**import** org.springframework.stereotype.Component;

/**
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/4/7
 * **@Description** Description
 */
@Aspect
@Component
@Slf4j
**public** **class** **DataSourceAop** {

    @Before("execution(* com.yyg.boot.service.impl.GoodsServiceImpl.*(..))")
    **public** **void** **setDataSource01**() {
        log.warn("db01商品数据源");
        DataSourceType.setDataSourceType(DataSourceType.SourceType.DS_SHOP);
    }

    @Before("execution(* com.yyg.boot.service.impl.UserServiceImpl.*(..))")
    **public** **void** **setDataSource02**() {
        log.warn("db02用户数据源");
        DataSourceType.setDataSourceType(DataSourceType.SourceType.DS_USER);
    }

}

11. 创建Entity实体类

11.1 Goods商品类

封装一个商品信息的实体类。

**package** com.yyg.boot.entity;

**import** lombok.Data;

**import** javax.persistence.*;

/**
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/4/3
 * **@Description** db1中的商品表
 */
@Entity
@Table(name = "goods")
@Data
**public** **class** **Goods** {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    **private** Long id;

    **private** String name;

}

11.2 User用户类

封装用户信息的实体类。

**package** com.yyg.boot.entity;

**import** lombok.Data;

**import** javax.persistence.*;

/**
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/4/3
 * **@Description** db4中的用户表
 */
@Entity
@Table(name = "user")
@Data
**public** **class** **User** {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    **private** Long id;

    **private** String username;

    **private** String birthday;

    **private** String sex;

    **private** String address;

}

12. 创建Dao层代码12.1 GoodsRepository类

12.1 GoodsRepository类

编写操作Goods商品信息的数据库Dao层接口。

**package** com.yyg.boot.dao.db01;

**import** com.yyg.boot.entity.Goods;
**import** com.yyg.boot.entity.User;
**import** org.springframework.data.jpa.repository.JpaRepository;
**import** org.springframework.data.jpa.repository.JpaSpecificationExecutor;
**import** org.springframework.stereotype.Repository;

/**
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/4/3
 * **@Description** Description
 */
@Repository
**public** **interface** **GoodsRepository** **extends** **JpaRepository**<**Goods**, **Long**>,**JpaSpecificationExecutor**<**User**> {
}

12.2 UserRepository类

编写操作User用户信息的数据库Dao层接口。

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-E1wBvu1t-1713374685866)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值