cgb2107-day17 待我称王封你为后i 2022-09-11 10:29 170阅读 0赞 ### 文章目录 ### * * 一,IOC的xml方式--了解 * * \--1,项目结构 * \--2,创建Hello类 * \--3,创建User类 * \--4,创建配置文件 * \--5,创建测试类 * 二,IOC的注解方式--重点 * * \--0,项目结构 * \--1,创建类 * \--2,配置包扫描 * \--3,测试 * 三,模拟 DI依赖注入 * * \--1,概述 * \--2,测试 * * 创建Emp类 * 创建Dept 类 * 创建测试类 * 四,Spring提供的DI依赖注入 * * \--1,创建UserInfo 类 * \--2,创建Order 类 * \--3,测试类 * \--4,总结 * 扩展:SpringMVC源码里的核心方法 ## 一,IOC的xml方式–了解 ## ### –1,项目结构 ### ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAY2dibHB4_size_17_color_FFFFFF_t_70_g_se_x_16] ### –2,创建Hello类 ### package cn.tedu.spring; public class Hello { public void hi(){ System.out.println("hello springioc~"); } } ### –3,创建User类 ### package cn.tedu.spring; public class User { public void eat(){ System.out.println(123); } } ### –4,创建配置文件 ### <?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"> <!--spring认为万物皆是bean,配置bean的位置,spring自动完成ioc class属性用来描述类的全路径, id属性用来作为bean的唯一标识 scope="prototype"用来设置对象是多例的,默认是singleton单例的 IOC底层是Map结构,Map<id的值,类的对象>,数据结类似: {"hello",new Hello()} spring只能用反射创建对象: {"hello",Class.forName("cn.tedu.spring.Hello").newInstance() } --> <bean class="cn.tedu.spring.Hello" id="hello"></bean> <bean class="cn.tedu.spring.User" id="user"></bean> </beans> ### –5,创建测试类 ### package cn.tedu.spring; import org.junit.jupiter.api.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test1 { //测试IOC(创建类+配置类) @Test//junit单元测试方法:@Test void public 没有参数 public void ioc(){ //1,读取配置文件--参数是配置文件的路径 ClassPathXmlApplicationContext spring = new ClassPathXmlApplicationContext( "spring-config.xml"); //2,获取spring创建好的对象--参数是配置文件里bean标签的id的值 Object o = spring.getBean("hello"); System.out.println(o);//cn.tedu.spring.Hello@43bc63a3 Hello h = (Hello) o; h.hi(); //单例对象:节省内存和时间,spring框架默认的创建单例对象的方式 Hello h2 = (Hello) spring.getBean("hello"); // System.out.println(o2);//cn.tedu.spring.Hello@43bc63a3 h2.hi(); //java.lang.ClassCastException:cn.tedu.spring.Hello cannot be cast to cn.tedu.spring.User //User uu = (User) spring.getBean("hello"); //System.out.println(uu); Object o3 = spring.getBean("user"); System.out.println(o3);//cn.tedu.spring.User@38425407 //向下转型:把父类类型变成子类类型,目的要用子类的功能 User u = (User) o3 ; u.eat(); } } ## 二,IOC的注解方式–重点 ## 1, 创建类, 类上使用IOC的注解 2, 创建配置文件, 指定包扫描的路径 3, 直接getBean(“类名首字母要变成小写”) spring认为万物皆是bean,配置bean的位置,spring自动完成ioc class属性用来描述类的全路径, id属性用来作为bean的唯一标识 scope="prototype"用来设置对象是多例的,默认是singleton单例的 IOC底层是Map结构,Map<id的值,类的对象>,数据结类似: {"hello",new Hello()} spring只能用反射创建对象: {"hello",Class.forName("cn.tedu.spring.Hello").newInstance() } ### –0,项目结构 ### ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAY2dibHB4_size_13_color_FFFFFF_t_70_g_se_x_16] ### –1,创建类 ### package cn.tedu.spring; import org.springframework.stereotype.Component; @Component //用来让spring完成ioc {"person"=new Person()} public class Student { public void study(){ System.out.println("Student.study()"); } } package cn.tedu.spring; import org.springframework.stereotype.Component; @Component //用来让spring完成ioc {"person"=new Person()} public class Person { public void show(){ System.out.println("Person.show()"); } } ### –2,配置包扫描 ### <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!--包扫描:扫描 指定包 以及 子包里的所有资源,找到有IOC注解的类就进行new IOC的注解包括: @Component @Service @Controller base-package 用来指定包路径,范围越小越好,性能高 --> <context:component-scan base-package="cn.tedu"></context:component-scan> </beans> ### –3,测试 ### package cn.tedu.spring; import org.junit.jupiter.api.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test1 { //单元测试方法 @Test public void ioc(){ //1,读取配置文件---参数是配置文件的路径 ClassPathXmlApplicationContext spring = new ClassPathXmlApplicationContext( "spring.xml"); //2,getBean()---参数是类名,首字母小写 Object o = spring.getBean("person"); System.out.println(o);//cn.tedu.spring.Person@7e5afaa6 Object o1 = spring.getBean("student"); System.out.println(o1); Object o2 = spring.getBean("animal"); System.out.println(o2); } } ## 三,模拟 DI依赖注入 ## ### –1,概述 ### 维护了两个对象间的关系,方便在使用A的同时可以看到关联的B的数据 ### –2,测试 ### #### 创建Emp类 #### package cn.tedu.di; public class Emp { String name = "吴谦"; //绑定了两个类的关系--依赖 private Dept d; //get set public Dept getD() { return d; } public void setD(Dept d) { this.d = d; } @Override public String toString() { return "Emp{" + "name='" + name + '\'' + ", d=" + d + '}'; } } #### 创建Dept 类 #### package cn.tedu.di; public class Dept { String name = "java软件开发一部"; @Override public String toString() { return "Dept{" + "name='" + name + '\'' + '}'; } } #### 创建测试类 #### package cn.tedu.di; import org.junit.Test; public class TestDi { @Test public void di(){ //1,创建对象 Emp e = new Emp(); Dept d = new Dept(); //Emp{name='吴谦', d=null} System.out.println(e); //2,di维护了两个对象间的关系-set() e.setD(d); //Emp{name='吴谦', d=Dept{name='java软件开发一部'}} System.out.println(e); } } ## 四,Spring提供的DI依赖注入 ## ### –1,创建UserInfo 类 ### package cn.tedu.di2; import org.springframework.stereotype.Component; @Component//ioc -- {"userInfo"=new UserInfo()} public class UserInfo { String name="jack"; @Override public String toString() { return "UserInfo{" + "name='" + name + '\'' + '}'; } } ### –2,创建Order 类 ### package cn.tedu.di2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component//ioc--{"order"=new Order()} public class Order { String name = "iphone13"; //get set @Autowired //di private UserInfo ui; @Override public String toString() { return "Order{" + "name='" + name + '\'' + ", ui=" + ui + '}'; } } ### –3,测试类 ### package cn.tedu.di2; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestDI { @Test public void di(){ //1,读取配置文件 ClassPathXmlApplicationContext spring = new ClassPathXmlApplicationContext( "spring.xml"); //2,getBean()--DI:获取A的同时也获取到B的信息 Object o = spring.getBean("order"); //Order{name='iphone13',ui=UserInfo{name='jack'}} System.out.println(o); } } ### –4,总结 ### IOC: 控制翻转,Spring框架创建对象. 使用步骤: 1, 在类上使用注解@Component @Service @Controller 2, 配置包扫描 DI: 依赖注入,把两个对象之间的关系依赖. 使用步骤: 1, 先完成IOC 2, 用注解@Autowired ## 扩展:SpringMVC源码里的核心方法 ## ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAY2dibHB4_size_20_color_FFFFFF_t_70_g_se_x_16] [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAY2dibHB4_size_17_color_FFFFFF_t_70_g_se_x_16]: /images/20220828/6cba92ee012941f98df4b4f7154e660a.png [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAY2dibHB4_size_13_color_FFFFFF_t_70_g_se_x_16]: /images/20220828/4d7fdcbee03c4ceb9f26c2bb388466d6.png [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAY2dibHB4_size_20_color_FFFFFF_t_70_g_se_x_16]: /images/20220828/ada3fa99df784f21b87a99b448e5f18d.png
相关 cgb2107-day17 文章目录 一,IOC的xml方式--了解 \--1,项目结构 \--2,创建Hello类 \- 待我称王封你为后i/ 2022年09月11日 10:29/ 0 赞/ 171 阅读
相关 cgb2107-day08 文章目录 一,模拟 服务器解析浏览器发来的数据 二,CSS选择器 \--1,概述 \--2,简单选择器 旧城等待,/ 2021年09月11日 03:36/ 0 赞/ 284 阅读
还没有评论,来说两句吧...