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 控制 ...
随机推荐
- Python 生成二维码的几种方式、生成条形码
一: # 生成地维码 import qrcode import matplotlib.pyplot as plt from barcode.writer import ImageWriter 创建QR ...
- Linux开启SSH连接
1. 查看是否安装 openssh-server:yum list installed | grep openssh-server 已安装成功,如下图 2.如果没有任何输出显示表示没有安装openss ...
- Ant Design Vue Tree 选中子节点同时半选中父级节点
需要实现的效果: 1.子菜单如果不是全部选中,一级菜单半选. 2.子菜单全选,一级菜单选中. 3.一级菜单选择,二级菜单全选. 4.没有二级菜单,则只控制一级菜单. 主要用到的属性是checked和h ...
- #树状数组,CDQ分治#洛谷 4390 [BOI2007]Mokia 摩基亚
题目 分析 考虑离线处理,那么询问区间和就可以转换为四个询问, CDQ分治按横坐标处理询问,树状数组维护前缀和就可以了 代码 #include <cstdio> #include < ...
- js实现电子白板
功能:使用画笔绘制笔迹(线条).橡皮檫 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- js复制文字到剪切板
此方法仅适用于 IE demo <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- opengauss数据库-主从搭建
opengauss 数据库-主从搭建 环境说明 软件下载 opengauss 下载地址:https://opengauss.org/zh/download/ 环境准备 关闭 SELINUX 修改 /e ...
- Kalman滤波器的原理与实现
Kalman滤波器的原理与实现 卡尔曼滤波器(Kalman Filter)是一个十分强大滤波器,虽然叫做滤波器,卡尔曼滤波器其实可以起到到两个作用,即预测与更新,这与我们在其运行时所关注的环节有关.当 ...
- 直播预告丨 Hello HarmonyOS 进阶课程第五课——原子化服务
本周三<Hello HarmonyOS 系列应用篇:原子化服务>,HDE 李洋老师将带领大家了解 HarmonyOS 原子化服务的技术特性与创新性,对智能家居.智慧出行.运动健康.智慧办公 ...
- centos-stream-9 centos9 配置国内yum源 阿里云源
源配置 tips: yum配置文件路径 /etc/yum.repos.d/centos.repo 1.备份源配置 [Very Important!] mv /etc/yum.repos.d/cento ...