Spring5-DI-依赖注入(ioc获取类对象&&赋值)_类不注入spring中, 但类中的对象要赋值,怎么办

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

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

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

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

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

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

正文

配置引用集合类型的bean,引入新的命名空间

2)给Map集合赋值

直接配置集合类型的bean

配置引用集合类型的bean,引入新的命名空间

八.使用命名空间注入:


一.前期准备工作

创建实体类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方法)是另一个类,这里我们有三种方式注入

  1. 引用外部bean
  2. 使用内部bean
  3. 使用级联的方式(这种方式不常用,因为这种方式相当于修改值)

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️⃣零基础入门
① 学习路线

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

image

② 路线对应学习视频

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

image-20231025112050764

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

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

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

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

image

② 路线对应学习视频

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

image-20231025112050764

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值