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 控制 ...
随机推荐
- 聊聊微信小程序的隐私协议开发
为什么需要隐私协议? 小程序隐私授权弹窗FAQ官方:https://developers.weixin.qq.com/community/develop/doc/00000ebac5c3e042384 ...
- FPGA 原语之一位全加器
FPGA原语之一位全加器 1.实验原理 一位全加器,三个输入,两个输出.进位输出Cout=AB+BC+CA,本位输出S=A异或B异或C.实验中采用三个与门.一个三输入或门(另外一个是两个或门,功能一致 ...
- KingbaseES数据库配置Hikari数据源
Hikari是一个高性能的数据库连接池,它是Spring Boot 2.x中的默认数据源. 一.下载驱动 打开下面网址:选择对应平台的jdbc驱动程序. 人大金仓-成为世界卓越的数据库产品与服务提供商 ...
- KingbaseES数据库使用kdb_database_link扩展常见问题
KingbaseES数据库使用kdb_database_link扩展常见问题 kdb_database_link主要功能是为了满足@link语法的适配,让用户应用的代码能够适用于更宽泛的产品而无需在移 ...
- 巧用dblink 实现多进程并行查询
概述 对于分区表的大数据统计分析,由于数据量巨大,往往需要采用并行.但是数据库并行的效率相比分进程分表统计还是有比较大的差距.本文通过巧用dblink,实现分进程分分区统计数据. 例子 kingbas ...
- Make It Equal 题解
Problem Link 简要题意 翻译很清楚. 思路 提供一种简单直接的思路. 可以发现最多会操作 \(n\) 次. 那么就可以每次直接枚举切的高度 \(h\),检查更改是否超过 \(k\),之后暴 ...
- 内存分析利器之UMDH
近两周投入分析产品的内存泄漏问题. 测试团队反馈产品在安卓平台运行时,随用户操作,应用占用的内存出现上涨的趋势,停止操作并等待一段时间之后,应用占用的内存没有下降,怀疑存在内存泄漏问题. 结合复现的情 ...
- OpenHarmony社区运营报告(2023年6月)
本月快讯 • 6月12日,以"OpenHarmony共建开放,共享未来"为主题的2023开放原子全球开源峰会OpenAtom OpenHarmony(以下简称"Ope ...
- Asp .Net Core 系列:集成 Refit 和 RestEase 声明式 HTTP 客户端库
背景 .NET 中 有没有类似 Java 中 Feign 这样的框架?经过查找和实验,发现 在 .NET 平台上,虽然没有直接的 Feign 框架的端口,但是有一些类似的框架和库,它们提供了类似的功能 ...
- Docker之离线安装和在线安装
一.离线安装 1.软件包下载 https://download.docker.com/linux/static/stable/x86_64/ 2.安装docker tar xvf /opt/docke ...