先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
正文
一.前期准备工作
创建实体类Student学生类(与班级的关系:多对一):
public class Student {
private String stuName;
private Integer stuAge;
private String stuGender;
private Clazz clazz;
//增加一个数组类型的属性,爱好,用于后期测试数组注入
private String[] hobbies;
//增加一个Map集合类型的属性,即每个学生对应的老师信息,用于后期测试Map集合注入
private Map<Integer, Teacher> teacherMap;
public Student() {
}
public Student(String stuName, Integer stuAge, String stuGender, Clazz clazz) {
this.stuName = stuName;
this.stuAge = stuAge;
this.stuGender = stuGender;
this.clazz = clazz;
}
//没有clazz属性的构造方法
public Student(String stuName, Integer stuAge, String stuGender) {
this.stuName = stuName;
this.stuAge = stuAge;
this.stuGender = stuGender;
}
public Student(String stuName, Integer stuAge, String stuGender, Clazz clazz, String[] hobbies) {
this.stuName = stuName;
this.stuAge = stuAge;
this.stuGender = stuGender;
this.clazz = clazz;
this.hobbies = hobbies;
}
public void setTeacherMap(Map<Integer, Teacher> teacherMap) {
this.teacherMap = teacherMap;
}
public Student(String stuName, Integer stuAge, String stuGender, Clazz clazz, String[] hobbies, Map<Integer, Teacher> teacherMap) {
this.stuName = stuName;
this.stuAge = stuAge;
this.stuGender = stuGender;
this.clazz = clazz;
this.hobbies = hobbies;
this.teacherMap = teacherMap;
}
public String[] getHobbies() {
return hobbies;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public Integer getStuAge() {
return stuAge;
}
public void setStuAge(Integer stuAge) {
this.stuAge = stuAge;
}
public String getStuGender() {
return stuGender;
}
public void setStuGender(String stuGender) {
this.stuGender = stuGender;
}
public Clazz getClazz() {
return clazz;
}
public void setClazz(Clazz clazz) {
this.clazz = clazz;
}
public Map<Integer, Teacher> getTeacherMap() {
return teacherMap;
}
@Override
public String toString() {
return "Student{" +
"stuName='" + stuName + '\'' +
", stuAge=" + stuAge +
", stuGender='" + stuGender + '\'' +
", clazz=" + clazz +
", hobbies=" + Arrays.toString(hobbies) +
", teacherMap=" + teacherMap +
'}';
}
}
创建clazz班级类(与学生类的关系:一对多)
public class Clazz {
private String cName;
private Integer cId;
private List<Student> students;
public Clazz() {
}
public Clazz(String cName, Integer cId, List<Student> students) {
this.cName = cName;
this.cId = cId;
this.students = students;
}
public String getcName() {
return cName;
}
public void setcName(String cName) {
this.cName = cName;
}
public Integer getcId() {
return cId;
}
public void setcId(Integer cId) {
this.cId = cId;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Clazz{" +
"cName='" + cName + '\'' +
", cId=" + cId +
", students=" + students +
'}';
}
}
创建Teacher老师类:
public class Teacher {
private Integer teaId;
private String teaName;
public Teacher() {
}
public Teacher(Integer teaId, String teaName) {
this.teaId = teaId;
this.teaName = teaName;
}
public Integer getTeaId() {
return teaId;
}
public void setTeaId(Integer teaId) {
this.teaId = teaId;
}
public String getTeaName() {
return teaName;
}
public void setTeaName(String teaName) {
this.teaName = teaName;
}
@Override
public String toString() {
return "Teacher{" +
"teaId=" + teaId +
", teaName='" + teaName + '\'' +
'}';
}
}
二.使用setter方法给实体类的属性注入(赋值)
applicationContext.xml-标签:
说明:使用标签,name为实体类的属性名,value为值(字面值,没有引申的值),ioc容器中调用的是实体类属性中的setter方法
<!--依赖注入-->
<!-- 1.普通属性赋值,使用property属性
value的值为字面值,即没有其它的引申值的意思
-->
<bean id="studentOne" class="com.aimin.spring.Student">
<property name="stuName" value="小四"></property>
<property name="stuAge" value="10"></property>
<property name="stuGender" value="man"></property>
</bean>
测试代码:
@Test
public void testDI(){
//获取ioc容器
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
//1.普通属性赋值
Student studentOne = ioc.getBean("studentOne", Student.class);
System.out.println("普通属性赋值:");
System.out.println(studentOne);
//2.构造器赋值
Student studentTwo= ioc.getBean("studentTwo", Student.class);
System.out.println("构造器赋值:");
System.out.println(studentTwo);
//3.特殊字符赋值
Student studentThree = ioc.getBean("studentThree", Student.class);
System.out.println("特殊字符赋值:");
System.out.println(studentThree);
//测试clazz属性是否为空对象,是的话,里面没有toString()方法,会报空指针异常
//System.out.println(studentThree.getClazz().toString());
//4.类属性注入
// 三种方式:内部bean,外部bean,级联(很少用)
// 4.1,外部bean/级联bean
Student studentFour = ioc.getBean("studentFour", Student.class);
System.out.println("级联bean:");
System.out.println(studentFour);
//4.2 内部bean
Student studentFive = ioc.getBean("studentFive", Student.class);
System.out.println("内部bean:");
System.out.println(studentFive);
//4.3 数组赋值
Student studentSix = ioc.getBean("studentSix", Student.class);
System.out.println("数组赋值(hobbies):");
System.out.println(studentSix);
//<!-- 6.为集合类型赋值-->
//<!-- 6.1使用外部约束util:list,引用集合类型的bean-->
Clazz classOne = ioc.getBean("classOne", Clazz.class);
System.out.println("使用外部约束util:list,引用集合类型的bean:");
System.out.println("橙留香这个班级的学生是随便添加的,不一定是这个班的:");
System.out.println(classOne);
//<!-- 6.2使用list标签-->
Clazz classTwo = ioc.getBean("classTwo", Clazz.class);
System.out.println("使用list标签:");
System.out.println("橙留香这个班级的学生是随便添加的,不一定是这个班的:");
System.out.println(classTwo);
//<!-- 7.为集合类型赋值-->
//<!-- 直接使用map标签配置bean-->
Student studentSeven = ioc.getBean("studentSeven", Student.class);
System.out.println("使用map标签配置bean:");
System.out.println(studentSeven);
//<!-- 配置引用集合类型的bean,引入新的命名空间(util:)-->
Student studentEight = ioc.getBean("studentEight", Student.class);
System.out.println("引用集合类型的bean,引入新的命名空间");
System.out.println(studentEight);
//使用命名空间p:
Student studentNine = ioc.getBean("studentNine", Student.class);
System.out.println("使用p命名空间注入的bean对象:");
System.out.println(studentEight);
}
运行结果
三.构造器注入
applicationContext.xml-标签:
说明:使用标签,根据标签个数(属性个数匹配构造器方法,也可以指定某属性和索引(index:参数的位置;name:属性名),来使用某特定的构造器)
<bean id="studentTwo" class="com.aimin.spring.Student">
<constructor-arg value="小五"></constructor-arg>
<constructor-arg value="20"></constructor-arg>
<constructor-arg value="girl" name="stuGender"></constructor-arg>
</bean>
测试代码(和第一种setter方式注入的代码一致,即通过id和类类型获取bean对象,不做展示)
四.实体类属性为类时的注入
说明:即bean对象中有的成员变量(setter方法)是另一个类,这里我们有三种方式注入
- 引用外部bean
- 使用内部bean
- 使用级联的方式(这种方式不常用,因为这种方式相当于修改值)
applicationContext.xml-标签:
引用外部bean
<bean id="studentFour" class="com.aimin.spring.Student">
<property name="stuName" value="小六"></property>
<property name="stuAge" value="33"></property>
<property name="stuGender" value="man"></property>
<!-- 4.1,外部bean-->
<property name="clazz" ref="clazzOne">
</property>
<!-- 级联的方式,类似于修改属性-->
<!-- <property name="clazz" ref="clazzOne"></property>-->
<!-- <property name="clazz.cId" value="4"></property>-->
<!-- <property name="clazz.cName" value="超人强班"></property>-->
</bean>
<!--外部bean-->
<bean id="clazzOne" class="com.aimin.spring.Clazz">
<property name="cId" value="1"></property>
<property name="cName" value="21软件工程C班"></property>
</bean>
运行结果:
使用内部bean
<!-- 4.2,内部bean-->
<bean id="studentFive" class="com.aimin.spring.Student">
<property name="stuName" value="小七"></property>
<property name="stuAge" value="33"></property>
<property name="stuGender" value="man"></property>
<property name="clazz">
<!-- 内部bean可以省略id,因为ioc容器不能直接从外部获取-->
<bean id="clazzInner" class="com.aimin.spring.Clazz">
<property name="cName" value="猪猪侠班"></property>
<property name="cId" value="3"></property>
</bean>
</property>
</bean>
运行结果:
使用级联的方式
<bean id="studentFour" class="com.aimin.spring.Student">
<property name="stuName" value="小六"></property>
<property name="stuAge" value="33"></property>
<property name="stuGender" value="man"></property>
<!-- 4.1,外部bean-->
<!-- <property name="clazz" ref="clazzOne">-->
<!-- </property>-->
<!-- 级联的方式,类似于修改属性-->
<property name="clazz" ref="clazzOne"></property>
<property name="clazz.cId" value="4"></property>
<property name="clazz.cName" value="超人强班"></property>
</bean>
运行结果:
还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!
王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。
对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!
【完整版领取方式在文末!!】
93道网络安全面试题
内容实在太多,不一一截图了
黑客学习资源推荐
最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
1️⃣零基础入门
① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-R1y86Nx0-1713404389996)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!