😉😉 学习交流群:
✅✅1:这是孙哥suns给大家的福利!
✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料
🥭🥭3:QQ群:583783824 📚📚 工作微信:BigTreeJava 拉你进微信群,免费领取!
🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞
💞💞5:以上内容,进群免费领取呦~ 💞💞💞💞
文章目录
一:Spring中的注入
1:什么是注入
2:为什么注入
3:如何注入?
4:注入好处
5:Spring注入的过程
编辑二:Set注入详解
1:JDK内置类型
2:用户自定义类型
(一):第一种方式
(二):第二种方式
3:Set注入简化写法
(一):基于属性的简化
(二):基于p空间简化属性
三:构造注入
1:开发步骤
2:构造方法的重载
3:注入的总结
四:反转控制和依赖注入
1:什么叫做控制反转
2:什么是依赖注入
一:Spring中的注入
1:什么是注入
注入就是通过Spring的工厂类和spring的配置文件,对Spring所创建的对象进行赋值,为成员变量进行赋值
2:为什么注入
为什么需要Spring工厂创建对象的时候给对象进行赋值呢?
1:通过配置文件进行注入也可以实现解耦合的这样的作用,直接写死在代码当中会引发耦合效应
2:通过编码的方式为成员边量进行赋值会出现耦合,注入的方式会避免这样的耦合的作用
3:如何注入?
<bean id = "person" class = "com.pactera.spring.Person"><!--property标签是复制标签,name属性是对应bean类中的属性。--><property name = "id"><value>10</value></property><property name = "name"><value>xjr</value></property></bean>
这是注入的一种示例:为成员变量提供set和get方法,这是注入的第一步
4:注入好处
使用Spring的依赖注入的好处就是可以基于Spring的配置文件来做对象的成员变量赋值工作,这样不需要在Java代码中显示的给对象成员变量赋值,起到了解耦合的作用!
5:Spring注入的过程
Spring获取到配置文件路径之后,调用demo4j这个第三方组件来对xml配置文件进行解析,根据解析的内容创建对应的对象。对象创建之后,根据property标签中的配置的属性的值,根据对象的set和get方法进行赋值操作。
Spring会通过底层属性对应的set方法进行赋值才完成对应的赋值操作,这种方式我们也称为set注入
二:Set注入详解
针对于不同类型的成员变量,在标签中进行注入的方式也不一样,不过都得嵌套到property标签当中。
JDK内置类型:JDK自定义的数据类型或者叫引用类型。
用户自定义类型:用户自定义的类型
1:JDK内置类型
1、string+8中基本类型。<property name = "id"><value>10</value></property><property name = "name"><value>xjr</value></property>2、数组<property name="emails"><!--这个是为了定义数组--><list><value>suns@pactera.com</value><value>cuilei@pactera.com</value><value>kaixin@pactera.com</value></list></property>3、set集合<set><!--在这里能用value标签是因为在Set<String>属于八中基本类型和String的范畴。--><value>138111111111</value><!--ref这个标签是给自定义类的注入进行使用的。--><ref bean=""/><!--set集合当中还可以套用set集合--><set></set></set>4、list集合<property name="address"><list ><!--这是list集合的写法,list集合是有序的,list集合是可以重复的。--><value>zpark</value><value>shangdi</value><value>xierqi</value><set></set><ref></ref><list></list></list></property>5、map集合赋值方式<property name="qqs"><!--这里是map的写法。--><map><entry><key><value>suns</value></key><value>43222222222222</value></entry><entry><key><value>xiexei</value></key><value>43222222222222</value></entry>
<!-- <entry>当key或者value是对象的时候<key><value>zhang</value></key><ref bean="">43222222222222</ref><key><ref bean="">zhang</ref></key><ref bean="">43222222222222</ref></entry>--></map></property>
properties类型的赋值中更加复杂的JDK类型比如说:date类型需要使用自定义类型转换器进行,这是在工厂的高级部分进行讲解。
2:用户自定义类型
(一):第一种方式
1:第一步还是为成员变量提供get和set方法
2:第二步在配置文件中进行注入
补充说明:
1:通过这样一种编译时耦合与接口+配置文件中定义注入类型的这样的形式,最大程度上降低了代码的耦合型
2:这种写法代码冗余,而且会重复创建某个对象。写一个bean标签就会创建一个对象,而且注入的这个对象不可能被复用只能在这个对象中被引用,被注入的对象多次创建就会浪费虚拟机内存的资源
以下是代码示例:
/** @Description:给自定义引用类型赋值。* @Author: DaShu* @Date: 2021/5/28 16:02* result:说明配置文件当中这样写可以实现自定义类型的注入。*///<bean id="userService" class = "com.pactera.spring.UserServiceImpl">// <property name="userDao">// <!--这个dao对象只使用一次,并且不会被其他对象使用。-->// <bean class = "com.pactera.spring.UserDaoImpl"/>// </property>//</bean>//<bean id="userService" class = "com.pactera.spring.UserServiceImpl">// <property name="userDao">// <ref bean="userDao"/>// </property>//</bean>//<bean id="userDao" class="com.pactera.spring.UserDaoImpl"></bean>//<ref local = "">这个标签从spring4就已经废除了,这个只能引用本配置文件中的bean@Testpublic void test11() throws Exception {ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");UserService userService = (UserService)ctx.getBean("userService");Class clazz = userService.getClass();Field userDao = clazz.getDeclaredField("userDao");userDao.setAccessible(true);//Object o = userDao.get(userService);//System.out.println(o.getClass().getTypeName());//com.pactera.spring.UserDaoImplSystem.out.println(userDao.getGenericType());System.out.println(userDao.getName());System.out.println(userDao.get(userService).getClass().hashCode() == UserDaoImpl.class.hashCode());//true}
<bean id="userService" class = "com.pactera.spring.UserServiceImpl"><property name="userDao"><!--这个dao对象只使用一次,并且不会被其他对象使用。--><bean class = "com.pactera.spring.UserDaoImpl"/></property></bean>
(二):第二种方式
3:Set注入简化写法
(一):基于属性的简化
执行test方法的快捷键是 ctrl+shift+f10
这是jdk类型的注入的形式。
<property name = "name"><value = "suns">
</property>
该类型的简化写法
<property name = "name" value = "suns"/>
用value属性代替value标签。
注意:通过value属性只能简化八中基本类型和String类型。用户自定义类型:
<property name = "userDao"><ref bean = "userDao">
</property>
<property name= "userDao" ref = "userDao"/>
注意:这种方式只能替换ref属性的形式。
(二):基于p空间简化属性
适用于jdk的类型的简化:
alt+enter可以导入这个命名空间P的配置,在这个配置当中,有了这个命名空间之后,Property标签就没用了
三:构造注入
注入:通过Spring的配置文件,为成员变量赋值
Set注入:Spring通过Set方法,通过配置文件,为成员变量赋值
构造赋值:Spring通过构造方法,通过配置文件,为成员变量赋值
1:开发步骤
提供有参构造方法、提供spring的配置文件进行配置
<bean id = "customer" class="com.pactera.spring.constructor.Customer"><!--一个这样的标签对应一个这样的参数。并且顺序还是对应的。--><constructor-arg index="0"><value>suns</value></constructor-arg><constructor-arg index="1"><value>102</value></constructor-arg></bean>
/** @Description:用于测试构造工厂* @Author: DaShu* @Date: 2021/5/31 11:21*/@Testpublic void test13(){ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");Customer customer = (Customer) ctx.getBean("customer");System.out.println(customer.toString());//Customer{name='suns', age=102}}
2:构造方法的重载
参数的个数不同时通过constructor-arg标签的个数进行区分
参数相同时,通过在这个标签中引入type标签就可以解决
3:注入的总结
Set注入 vs 构造注入,未来这两种我们到底是使用什么注入
1:未来实战:使用set注入会更多,构造注入会更多,有重载,更麻烦,
2:Spring底层他自己的一些对象的配置,也是使用大量的set的注入,构造注入用的比较少。
四:反转控制和依赖注入
1:什么叫做控制反转
控制:控制值得是对于对象创建、程序变量赋值的控制权,控制和注入的关系不是并列的关系,控制翻转依赖注入的,注入是控制翻转中的一个环节,例如:直接在代码中完成对于成员边量的赋值,这提高了代码的耦合,这样的控制权是在代码中的,提高了耦合性,将成员变量的赋值权交给Spring工厂和他的配置文件,这样就通过注入的方式,控制权是在Spring上边,解开了耦合性。
控制反转也就是说:对于对象的创建、对象的成员变量的赋值的权利翻转到spring的工厂和配置文件当中,可以起到解耦合的作用,控制反转的好处解耦合的作用。
底层实现:工厂设计模式,反射+配置文件
代码编写中最好的降低耦合性的方式:
反射+配置文件+耦合月接口,可以把代码的耦合性降低早最低。
2:什么是依赖注入
通过Spring的工厂和配置文件为对象的成员变量赋值,依赖:我需要你的时候,你就是我的依赖:比如说:Service层中的Dao层的对象,就可以说Service层依赖dao层。Dao层是Service层的依赖。我依赖谁,就可以把他作为成员变量通过,spring的配置文件,创建他的对象,给我注入。好处:解耦合,通过提供set,get方法,最终通过Spring的配置文件完成对象的创建和注入
😉😉 学习交流群:
✅✅1:这是孙哥suns给大家的福利!
✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料
🥭🥭3:QQ群:583783824 📚📚 工作微信:BigTreeJava 拉你进微信群,免费领取!
🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞
💞💞5:以上内容,进群免费领取呦~ 💞💞💞💞