先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
正文
然后再编写第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 (备注网络安全)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-E1wBvu1t-1713374685866)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!