spring ioc基础 对象 DI

spring ioc基础 对象 DI

基础

1.创建spring的web项目

在这里插入图片描述

2 .导包

在这里插入图片描述

3.编写基础的测试代码
controller层 MyServlet
package com.bjsxt.controller;

@WebServlet("/my")
public class MyServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码格式
        //设置响应编码格式
        //获取请求信息
        //处理请求信息
            //获取业务层对象---传统方案,在Servlet中直接获取,耦合性高。
                //MyService myService=new MyServiceImpl2();
                //myService.testService();
            //SpringIOC的方式---导入jar包,
                //获取Spring容器对象
                ApplicationContext ac=new ClassPathXmlApplicationContext("applicationcontext.xml");
                MyService myService = (MyService) ac.getBean("myService");
                myService.testService();
        //响应处理结果
    }
}
applicationcontext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置资源对象-->
<bean id="myService" class="com.bjsxt.service.impl.MyServiceImpl2"></bean>
</beans>
MyServiceImpl2
package com.bjsxt.service.impl;

import com.bjsxt.service.MyService;

public class MyServiceImpl2 implements MyService {
    @Override
    public void testService() {
        System.out.println("MyServiceImpl2.testService-----升级方法");
    }
}
MyService
package com.bjsxt.service;

public interface MyService {
    //测试业务方法
    void testService();
}

在这里插入图片描述

在这里插入图片描述

4.测试 http://localhost:8080/my

在这里插入图片描述

对象

1.测试类编写
package com.bjsxt.controller;

import com.bjsxt.pojo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestIocObject {
    public static void main(String[] args) {
        //获取Spring容器对象
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationcontext.xml");
        //获取Spring容器中的对象
            //1.构造器方式创建
                //无参数构造器
               Student student= (Student) ac.getBean("stu");
                System.out.println("我是无参数构造器创建:"+student);
                //有参数的构造器
                Student student1= (Student) ac.getBean("stu2");
                System.out.println("我是有参数构造器:"+student1);
            //2.使用属性注入的方式
                Student student2= (Student) ac.getBean("stu3");
                System.out.println("我是属性注入方式:"+student2);

            //3.工厂模式
                //动态工厂
                Student student3= (Student) ac.getBean("stu4");
                System.out.println("我是动态工厂方式:"+student3);
                //动态工厂
                Student student4= (Student) ac.getBean("stu5");
                System.out.println("我是静态工厂方式:"+student4);

    }

}
2.applicationcontext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--IOC创建对象的方法方式学习:Spring容器对象在被创建的时候,就完成了配置文件中类对象资源的初始化创建, 直接从容器中获取使用-->
        <!--1、通过构造器方式-->
            <!--无参数构造器:默认方式-->
            <bean id="stu" class="com.bjsxt.pojo.Student"></bean>
            <!--
                有参数构造器:
                    在bean标签下使用constructor-arg子标签来声明要调用的有参数的构造器
                    一个constructor-arg子标签表示一个参数。constructor-arg仅仅表示参数的个数
                    但是参数数量相同的构造器可能会有很多,需要继续在constructor-arg标签上
                    使用属性来声明构造器的其他特点,目的保证Spring容器对象只能找到一个对应的构造器。
                    constructor-arg的属性
                        index属性:表示形参的角标
                        name属性:形参名
                        type属性:形参的类型,类型的全限定路径
                        value属性:初始化的值
                缺陷:
                    必须要有对应的构造器
            -->
            <bean id="stu2" class="com.bjsxt.pojo.Student">
                <constructor-arg index="0" name="sid" type="java.lang.Integer" value="1"></constructor-arg>
                <constructor-arg index="1" name="sname" type="java.lang.String" value="张三"></constructor-arg>
            </bean>
        <!--
            2、通过属性注入方式
                相当于我们之前自己先创建一个空对象,然后调用set方法完成属性赋值。
                注意:
                    必须提供属性的set/get方法
                使用:
                    在bean标签下使用property子标签,一个property子标签表示调用一个set方法
                    使用property的属性来表明要调用的set方法:
                    name属性:对象中的属性名
                    value属性:值
         -->
            <bean id="stu3" class="com.bjsxt.pojo.Student">
                <property name="sid" value="2"></property>
                <property name="fav" value="唱歌"></property>
            </bean>
        <!--
            3、通过工厂创建对象
                本质:
                    Spring容器对象创建工厂,然后调用工厂生产对应的对象,存储到Spring容器中
                    从Spring容器中获取生产好的对象使用即可。
        -->
            <!--动态工厂方式:-->
                <!--创建工厂对象-->
                <bean id="factory" class="com.bjsxt.pojo.StudentFactory"></bean>
                <!--生产对象-->
                <bean id="stu4" factory-bean="factory" factory-method="newIntance"></bean>
            <!--静态工厂-->
                <bean id="stu5" class="com.bjsxt.pojo.StudentStaticFactory" factory-method="newIntance"></bean>

</beans>
3.Student StudentFactory StudentStaticFactory
package com.bjsxt.pojo;

import java.util.Objects;

public class Student {
    private Integer sid;
    private String sname;
    private String fav;

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", fav='" + fav + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(sid, student.sid) &&
                Objects.equals(sname, student.sname) &&
                Objects.equals(fav, student.fav);
    }

    @Override
    public int hashCode() {
        return Objects.hash(sid, sname, fav);
    }

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getFav() {
        return fav;
    }

    public void setFav(String fav) {
        this.fav = fav;
    }

    public Student() {
        System.out.println("我是学生的无参数构造器");
    }

    public Student(Integer sid, String sname, String fav) {
        this.sid = sid;
        this.sname = sname;
        this.fav = fav;
        System.out.println("sid = " + sid + ", sname = " + sname + ", fav = " + fav);
    }
    public Student(Integer sid, String sname) {
        this.sid = sid;
        this.sname = sname;
        System.out.println("sid = " + sid + ", sname = " + sname);
    }

    public Student(String fav ,Integer sid) {
        this.sid = sid;
        this.fav = fav;
        System.out.println("fav = " + fav + ", sid = " + sid);
    }
}
package com.bjsxt.pojo;

public class StudentFactory {
    public Student newIntance(){
        //声明Student对象创建的其他依赖资源
        System.out.println("我是动态工厂");
        return  new Student();
    }
}
package com.bjsxt.pojo;

public class StudentStaticFactory {
    public static Student newIntance(){
        //声明Student对象创建的其他依赖资源
        System.out.println("我是静态工厂");
        return  new Student();
    }
}
4.测试

在这里插入图片描述

从结果来看,都是spring对javabean进行实例化后,再执行测试方法!

DI

1.测试类编写
package com.bjsxt.controller;

import com.bjsxt.pojo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestIocDI {
    public static void main(String[] args) {
        //获取Spring容器对象
                ApplicationContext ac=new ClassPathXmlApplicationContext("applicationcontext.xml");
            //构造器依赖注入
                //获取学生对象
                Student student= (Student) ac.getBean("stu");
                System.out.println("构造器依赖注入:"+student);
            //属性依赖注入
                Student student1= (Student) ac.getBean("stu2");
                System.out.println("属性依赖注入:"+student1);


    }
}
2.applicationcontext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--DI依赖注入-->
        <!--构造器的依赖注入-->
            <!--创建学生bean-->
            <bean id="stu" class="com.bjsxt.pojo.Student">
                <constructor-arg index="0" type="java.lang.Integer" name="sid" value="1"></constructor-arg>
                <constructor-arg index="1" type="java.lang.String" name="sname" value="张三"></constructor-arg>
                <constructor-arg index="2" type="java.lang.String" name="fav" value="唱歌"></constructor-arg>
                <constructor-arg index="3" type="com.bjsxt.pojo.Teacher" name="teacher" ref="tea"></constructor-arg>
            </bean>
            <!--创建教师bean-->
            <bean id="tea" class="com.bjsxt.pojo.Teacher">
                <property name="tid" value="1"></property>
                <property name="tname" value="张老师"></property>
             </bean>
        <!--属性依赖注入-->
            <!--创建学生bean-->
            <bean id="stu2" class="com.bjsxt.pojo.Student">
                <property name="sid"   value="2"></property>
                <property name="sname"   value="李四"></property>
                <property name="fav"   value="敲代码"></property>
                <property name="teacher"   ref="tea2"></property>
            </bean>
            <!--创建教师bean-->
            <bean id="tea2" class="com.bjsxt.pojo.Teacher">
                <property name="tid" value="2"></property>
                <property name="tname" value="刘老师"></property>
            </bean>


</beans>
3.Student Teacher
package com.bjsxt.pojo;

import java.util.Objects;

public class Student {
    private Integer sid;
    private String sname;
    private String fav;
    private Teacher teacher;

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", fav='" + fav + '\'' +
                ", teacher=" + teacher +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(sid, student.sid) &&
                Objects.equals(sname, student.sname) &&
                Objects.equals(fav, student.fav) &&
                Objects.equals(teacher, student.teacher);
    }

    @Override
    public int hashCode() {
        return Objects.hash(sid, sname, fav, teacher);
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getFav() {
        return fav;
    }

    public void setFav(String fav) {
        this.fav = fav;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public Student(Integer sid, String sname, String fav, Teacher teacher) {
        this.sid = sid;
        this.sname = sname;
        this.fav = fav;
        this.teacher = teacher;
    }

    public Student() {
    }
}
package com.bjsxt.pojo;

import java.util.Objects;

public class Teacher {
    private Integer tid;
    private String tname;

    @Override
    public String toString() {
        return "Teacher{" +
                "tid=" + tid +
                ", tname='" + tname + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Teacher teacher = (Teacher) o;
        return Objects.equals(tid, teacher.tid) &&
                Objects.equals(tname, teacher.tname);
    }

    @Override
    public int hashCode() {
        return Objects.hash(tid, tname);
    }

    public Integer getTid() {
        return tid;
    }

    public void setTid(Integer tid) {
        this.tid = tid;
    }

    public String getTname() {
        return tname;
    }

    public void setTname(String tname) {
        this.tname = tname;
    }

    public Teacher() {
    }

    public Teacher(Integer tid, String tname) {
        this.tid = tid;
        this.tname = tname;
    }
}
4.测试 ok!

在这里插入图片描述

问题与思考

1.对于项目中的重复代码如何合理解决?

① 不同的方法中出现了重复代码–>将重复代码封装为工具方法,然后

在自己的方法中调用工具方法,同时声明自己的代码。

② 不同的类中出现了重复的代码—>封装工具类

③ 不同的项目出现了重复代码—>封装jar包

2.jar包与源文件,压缩文件的比较思考?

jar包是直接可以使用的class文件,是功能文件。

jar包的本质:

其实就是代码的class文件的压缩包,jdk可以直接调用无需解压。

jar包的使用:

将jar包资源放入到项目中后,需要add as library.

jar包的特点:

在项目中引入其他已经完成的代码的同时,保证项目原有代码的结构层次。

3.谈一谈对框架的理解?

概念:

不同的项目会使用相同的代码进行开发。而这部分代码如果要进行封装

不是一个类或者一个方法就能搞定的,需要封装出来很多的类文件,于是

为了方便其他人使用,我们再次将这些代码封装为jar包,所以,框架其实

就是不用的项目都会使用的代码的封装,软件的半成品。

本质:框架就是别人封装好的功能代码。

集体表现形式:

一堆jar包:封装好了都要使用的代码。

使用:

① 将jar包导入到自己的项目中

② 查阅API文档,调用jar包中的资源完成功能开发

③ 配置框架的配置文件(框架代码运行需要的常量数据)

数据和代码的解耦,使用者可以通过配置类来自定义数据。

学习:

就是使用别人的代码完成自己的功能开发。其实就是学习

如何使用别人的代码。想当于javaSE阶段学习常用类。

4.谈一谈spring框架?

概念:Spring是一个控制反转(IOC)和面向切面的(AOP)的轻量级框架.

使用范围:任何java程序.

作用:

①简化企业项目的开发的流程.提升开发效率

②便于代码的后期维护升级.

③将代码之间的耦合性降低.

内容:

SpringIOC的使用

SpringAOP的使用

SpringTX的使用

注意:

Spring是一个框架集,内部集成了很多的功能,可以根据需求 选择对应的子框架使用.

结构:

在这里插入图片描述

发明人:Rod Johnson

5.为什么用springIOC?

问题:

在使用MVC的结构体系来完成后台功能代码的声明时,在一定程度上降低了代码的冗余,但是层与层之间的耦合性过高,造成代码升级维护特别麻烦,比如,某天业务层某个类文件需要替换为新的类文件,那么,控制层所有调用该业务类的代码需要全部修改为调用新的业务类.---------------接口非常重要!

解决:

将层与层对象之间的关系进行解耦,由直接变为间接.

实现:

SpringIOC.

作用:

实现了层与层之间对象的逻辑性的解耦.

6.springIOC的原理?

在这里插入图片描述

没有是多加一层解决不了的,IOC的原理其实就是反射,Controller层获取Service层的对象,不直接获取,而是通过applicationcontext.xml利用反射原理进行获取。key value形式,下次Controller层在代码不变的情况下,调用不同的service实现类,只需要在xml配置文件中修改即可!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值