赞
踩
public UserDaolmpl(){ System.out.println("创建对象"); } @Override public void save() { System.out.println("save running......"); } //初始化方法 public void init(){ System.out.println("初始化。。。。"); }
//销毁方法
public void destroy(){
System.out.println("销毁.....");
}
}
> 测试代码
public class SpringTest {
@Test public void test01(){ ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao1 = (UserDao) app.getBean("userDao"); System.out.println(userDao1); ((ClassPathXmlApplicationContext)app).close(); }
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/3de3d797a1e74b92b116acdf3f73adef.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6YCa5b6AMjAyM-eahOS7o-eggQ==,size_14,color_FFFFFF,t_70,g_se,x_16#pic_center) * * * []( )4、依赖注入 ------------------------------------------------------------------------- > 问题引入: > > 1. 创建 UserService,UserService 内部在调用 UserDao的save() 方法 > > ``` > public class UserServiceImpl implements UserService { > @Override > public void save() { > ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); > UserDao userDao = (UserDao) app.getBean("userDao"); > userDao.save(); > } > } > > ``` > > 2. 将 UserServiceImpl 的创建权交给 Spring > > ``` > <bean id="userDao" class="com.kang.impl.UserDaolmpl"></bean> > <bean id="userService" class="com.kang.impl.UserServiceImpl"></bean> > > ``` > > 3. 从 Spring 容器中获得 UserService 进行操作 > > > ``` > @Test > public void test02(){ > ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); > UserService userService = (UserService) app.getBean("userService"); > userService.save(); > } > > ``` > > \[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gT469oAN-1645704192217)(Spring入门.assets/image-20220224093008916.png)\] 上述做法是将UserService实例和UserDao都存在spring容器中,然后再容器外部获取UserService实例和UserDao实例,然后在程序中进行结合 ![在这里插入图片描述](https://img-blog.csdnimg.cn/23291c97680349efaaddc5e1916cb7b0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6YCa5b6AMjAyM-eahOS7o-eggQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) > **这当中存在的问题是:加载配置文件的时候,不需要getBean方法,配置文件的内容都被执行了,导致配置文件加载了多次,浪费资源** > > **在test中,只需要UserService,但是UserDao也实例化了** **因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在 Spring容器中,将UserDao设置到UserService内部。** ![在这里插入图片描述](https://img-blog.csdnimg.cn/f3e27e9b1c194a78aad87184cd072c34.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6YCa5b6AMjAyM-eahOS7o-eggQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) > 要解决这个问题,就需要用到依赖引入 ![在这里插入图片描述](https://img-blog.csdnimg.cn/95606b91839d438283d11d40bd05dbe0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6YCa5b6AMjAyM-eahOS7o-eggQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) * * * ### []( )4.1、依赖引入的方式 > **通过构造方法和set方法实现将UserDao注入到UserService内部** * * * #### []( )4.1.1、set方法注入 > set方法注入的前提,是要在UserServiceImpl里定义一个私有变量UserDao > > 然后通过set方法给该私有变量赋值
public class UserServiceImpl implements UserService {
private UserDao userDao; @Override public void save() { userDao.save(); } public void setUserDao(UserDao userDao) { this.userDao = userDao; }
}
<bean id="userDao" class="com.kang.impl.UserDaolmpl"></bean>
<bean id="userService" class="com.kang.impl.UserServiceImpl">
<!--第一个userDao是指set方法后面的UserDao, 既setUserDao-->
<!--第二个userDao 是指上面的id的userDao的Bean实例化返回的UserDao对象-->
<property name="userDao" ref="userDao"/>
</bean>
> **注意:虽然两个userDao写法一样,但是两个userDao所代表的意思并不一样,注意区分** > **set方法注入还可以用P空间命名注入** > > 首先引入P空间命名空间: > > ``` > xmlns:p="http://www.springframework.org/schema/p" > > ``` > > 接着,修改注入方式: > > ``` > <bean id="userService" class="com.kang.impl.UserServiceImpl" p:userDao-ref="userDao"> > <!--第一个userDao是指set方法后面的UserDao(首字母大写换小写), 既setUserDao--> > <!--第二个userDao 是指上面的id的userDao(对象引用)--> > <!--<property name="userDao" ref="userDao"/>--> > </bean> > > ``` spring的XML配置文件如下:
<beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--<bean id="factory" class="com.kang.factory.UserDaolmplFactory"></bean>--> <!--<bean id="userDao" factory-bean="factory" factory-method="CreateUserDao"></bean>--> <!--<bean id="userDao" class="com.kang.impl.UserDaolmpl" init-method="init" destroy-method="destroy"></bean>--> <bean id="userDao" class="com.kang.impl.UserDaolmpl"></bean> <bean id="userService" class="com.kang.impl.UserServiceImpl" p:userDao-ref="userDao"> <!--第一个userDao是指set方法后面的UserDao, 既setUserDao--> <!--第二个userDao 是指上面的id的userDao--> <!--<property name="userDao" ref="userDao"/>--> </bean>
* * *
#### []( )4.1.2、通过构造方法注入
创建有参构造方法
package com.kang.impl;
import com.kang.dao.UserDao;
import com.kang.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
@ClassName UserServiceImpl
@Description TODO
@Author kang
@Date 2022/2/24 上午 9:22
@Version 1.0
*/
public class UserServiceImpl implements UserService {
private UserDao userDao; public UserServiceImpl(UserDao userDao) { this.userDao = userDao; } public UserServiceImpl() { } @Override public void save() { userDao.save(); }
}
配置spring的xml配置文件
<bean id="userService" class="com.kang.impl.UserServiceImpl" >
<!--第一个userDao是指有参构造方法的参数-->
<!--第二个userDao是指引用对象,即上面的id属性-->
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
Java的测试类代码依然不用变 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4281c706001047a3b1ae8f92f378da78.png#pic_center) * * * []( )5、Bean的依赖注入的数据类型 ----------------------------------------------------------------------------------- > Bean的依赖注入的数据类型有很多种,除了上面的对象**还支持普通数据类型,集合等**可以在容器中进行注入 > > **注入的三种基本数据类型** > > * 普通数据类型 > * 引用数据类型 > * 集合数据类型 > > 上述对对象的操作就是对引用数据类型的依赖注入 * * * ### []( )5.1、普通数据类型的注入
public class UserServiceImpl implements UserService {
private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } @Override public void save() { System.out.println("name = " + name); System.out.println("age = " + age); }
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
最新整理电子书
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
img-g8mLVu5A-1712261455992)]
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)
[外链图片转存中…(img-JhzcGkLP-1712261455993)]
最新整理电子书
[外链图片转存中…(img-DCeNpWfK-1712261455993)]
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。