Spring学习一(依赖注入/Bean/注解等)
- 1.Spring依赖注入的方式。
- 2.依赖注入的类型
- 3.Bean的作用域
- 4.自动注入
- 5.使用注解的方式
- 6.在spring配置文件中引入属性文件
1.Spring依赖注入的方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理。
spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”。
通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。
Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方 法注入,set方法参数注入,接口注入,这里我们先运用构造方法注入,set方法参数注入。
1.1通过set方法完成依赖注入
建好实体类Hello并生成set方法
private String name;
private Integer age;
在配置文件中写入代码以完成set方法依赖注入
<bean id="he" class="com.zhiyou100.spring.Hello">
<property name="name" value="地方大师傅"/>
<property name="age" value="33"/>
</bean>
写好测试类进行测试
1 public class Test {
2 public static void main(String[] args) {
3 ApplicationContext app=new ClassPathXmlApplicationContext("app.xml");
4 Hello hh = (Hello) app.getBean("he");
5 System.out.println(hh);
6 }
7 }
结果输出

一般我们建议使用set方法进行依赖注入
1.2通过构造方法注入
在上面的实体类中生成构造方法三种,无参,单参和全参
//无参
public Hello() {
super();
}
//单参
public Hello(String name) {
super();
this.name = name;
}
//全参
public Hello(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
在配置文件中进行依赖注入,其中传入两个参则寻找上面两个参的,一个则寻找单参的
<bean id="he2" class="com.zhiyou100.spring.Hello">
<constructor-arg index="0" value="李四"/>
<constructor-arg index="1" value="13"/>
</bean>
进行测试
1 public class Test {
2 public static void main(String[] args) {
3 ApplicationContext app=new ClassPathXmlApplicationContext("app.xml");
4 Hello hh = (Hello) app.getBean("he2");
5 System.out.println(hh);
6 }
7 }
测试结果为,依赖注入成功

2.依赖注入的类型
基本数据类型和字符串 使用value属性,如果是引入的对象类型则使用ref属性
在上面实体类的基础上加入新属性类型
private Student student;
private List<String> list;
private Map<Integer, String> map;
对应的student实体类为
1 public class Student {
2 private String addr;
3 public String getAddr() {
4 return addr;
5 }
6 public void setAddr(String addr) {
7 this.addr = addr;
8 }
9 @Override
10 public String toString() {
11 return "Student [addr=" + addr + "]";
12 }
13 }
编写配置代码
1 <bean id="he" class="com.zhiyou100.spring.Hello">
2 <property name="name" value="地方大师傅"/>
3 <property name="age" value="33"/>
4 <property name="student" ref="stu"/>
5 <property name="list">
6 <list>
7 <value>琼恩雪诺</value>
8 <value>史塔克三萨</value>
9 <value>提里昂</value>
10 </list>
11 </property>
12 <property name="map">
13 <map>
14 <entry key="1" value="啊啊啊"/>
15 <entry key="2" value="事实上"/>
16 <entry key="3" value="顶顶顶"/>
17 </map>
18 </property>
19 </bean>
20
21 <bean id="stu" class="com.zhiyou100.spring.Student">
22 <property name="addr" value="温哥华"/>
23 </bean>
编写测试代码,进行测试:
1 public class Test {
2 public static void main(String[] args) {
3 ApplicationContext app=new ClassPathXmlApplicationContext("app.xml");
4 Hello hh = (Hello) app.getBean("he");
5 System.out.println(hh);
6 System.out.println(hh.getMap());
7 }
8 }
测试成功后如下所示

3.Bean的作用域
Bean的作用域默认为单例模式
scope:表示bean的作用域,默认singleton, struts框架要求非单例
prototype:原生,非单例
<bean id="he" class="com.zhiyou100.spring.Hello" scope="prototype"/>
4.自动注入
新建两个实体类UserDao和UserService
public class UserDao {
private String uname;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public class UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
System.out.println("setUserDao");
this.userDao = userDao;
}
}
xml配置文件代码,其中userservice使用自动依赖注入autowire="byName"对于此属性的其他解释
byType:根据userDao属性的类型,找与之匹配的bean
private UserDao userDao;
byName :根据属性名找与之匹配的bean的id
no:需要手动注入
default :采取全局的default- autowire没置
<bean id="userDao" class="com.zhiyou100.spring.UserDao"/> <bean id="userservice" class="com.zhiyou100.spring.UserService" autowire="byName"/>
编写测试
public class UserTest {
public static void main(String[] args) {
ApplicationContext app=new ClassPathXmlApplicationContext("appUser.xml");
}
}
测试结果为

5.使用注解的方式

<context:component-scan base-package="com.zhiyou100.zhl"/>



6.在spring配置文件中引入属性文件
1 <context:property-placeholder location="classpath:my.properties"/>
2 <bean id="users" class="com.zhiyou100.spring.Users">
3 <!-- ${user.name}这个属性会打印电脑的用户名 -->
4 <property name="name" value="${users.name}"></property>
5 <property name="age" value="${users.age}"></property>
6 <property name="address" value="${users.address}"></property>
7 </bean>
users.name=zzzz
users.age=55
users.address=asdasd
测试结果为

若使用user.name这个属性会打印电脑的用户名,将上面的代码不变,改变这一条后测试结果为


Spring学习一(依赖注入/Bean/注解等)的更多相关文章
- Spring学习——DI(依赖注入)
IOC容器,处理对象依赖关系 IOC与DI: IOC :是一个容器,创建对象的容器 DI :在容器创建对象后,处理对象的依赖关系,也叫依赖注入! 方式1:通过set方法注入值 可以给普通属性.集合属性 ...
- Spring 学习之依赖注入
什么是依赖关系? 纵观所有的Java 应用,从基于Applet的小应用到多层次结构的企业级别的应用,他们都是一种典型的依赖性应用,也就是由一些互相协作的对象构成的,Spring把这种互相协作的关系称之 ...
- Spring 学习笔记 ----依赖注入
依赖注入 有三种方式,本文只学习下属性注入. 属性注入 属性注入即通过 setXxx方法()注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入方式是 ...
- Spring学习笔记--依赖注入
依赖注入和控制反转:http://baitai.iteye.com/blog/792980出自李刚<轻量级 Java EE 企业应用实战> Java应用是一种典型的依赖型应用,它就是由一些 ...
- Spring学习(一)---依赖注入和控制反转
Spring Spring是一个从实际开发中抽出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率. Spring为企业应用的开发提供 ...
- spring学习之依赖注入DI与控制反转IOC
一 Ioc基础 1.什么是Ioc? Ioc(Inversion of Control)既控制反转,Ioc不是一种技术,而是一种思想,在Java开发中意味着将设计好的对象交给容器来进行控制,并不是像传统 ...
- spring学习 五 依赖注入的方式
依赖注入有两种方式: 1 构造注入,如果<bean>标签下使用<contructor-arg>,则是构造注入 2 setter注入,就是调用setter方法注入,如果<b ...
- Spring学习--泛型依赖注入
暂时没有搞懂.
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
随机推荐
- 运行xxl-job,整合xxl-job至jeecg-boot项目
1.前言:xxl-job是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 源码仓库地址:https://gitee.co ...
- MemfireCloud让静态托管页面动起来!
静态托管 我们最常接触到的静态托管是github pages,它的常见工作模式是在github上创建一个仓库,使用hexo类的工具初始化仓库,编写markdown文件,生成静态页面,推送到github ...
- 【已解决】MySQL5.x和MySQL8.x 密码验证的区别(修改MySQL数据库密码的验证方式)
mysql5.x使用的是 mysql_native_password mysql8.x使用的是 caching_sha2_password 1. 进入mysql mysql -u root -p 2. ...
- 解锁OpenHarmony技术日!年度盛会,即将揭幕!
OpenHarmony技术日 即将揭幕!4月25日(星期一)09:00-18:00与你惊喜相约! 扫码直达 共建新技术.开拓新领域 OpenHarmony 工作委员会+7 家单位共同发起 ...
- NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL]
NL2SQL基础系列(1):业界顶尖排行榜.权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL.Text2DSL] Text-to-SQL(或者Text2S ...
- 【7】SpringBoot是什么?SpringBoot的优缺点有哪些?
随着动态语言的流行(Ruby.Groovy.Scala.Node.js),Java 的开发显得格外的笨重,繁多的配置.低下的开发效率.复杂的部署流程以及第三方技术集成难度大. 在上述环境下,Sprin ...
- 使用JSZip实现在浏览器中操作文件与文件夹
1. 引言 浏览器中如何创建文件夹.写入文件呢? 答曰:可以借助JSZip这个库来实现在浏览器内存中创建文件与文件夹,最后只需下载这个.zip文件,就是最终得结果 类似的使用场景如下: 在线下载很多图 ...
- 顺通鞋服进销存OA管理系统
鞋服进销存OA管理系统通过十几年的积淀与创新,顺通与众多鞋服企业一起共创,形成了涵盖协同办公.移动办公.知识管理.数据运营.多维门户等领域,以鞋服新品研发管理.生产排班管理.门店一体化管理.市场费用管 ...
- 本地使用ts配置
1.需要安装的依赖 "dependencies": { "html-webpack-plugin": "^5.5.0", "ts- ...
- 力扣138(java)- 复制带随机指针的链表(中等)
题目: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点. 构造这个链表的 深拷贝. 深拷贝应该正好由 n 个 全新 节点组成,其 ...