• 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.使用注解的方式

1. 引入jar包  aop的jar包
2. 配置文件中使用包扫描。 
<context:component-scan base-package="com.zhiyou100.zhl"/>
3. 在相应的类上加上注解.
@Repository  持久化注解。
@Service       业务层注解
@Controller   控制层注解
@Autowired   自动注入 按照类型帮你自动注入,如果由多个类型相同的那么就会在按照名称注入。(建议使用这个)
@Resouce     自动注入 按照名称注入,如果没有相同名称的bean那么会按照类型帮你注入。 它可以指定名称来注入。

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/注解等)的更多相关文章

  1. Spring学习——DI(依赖注入)

    IOC容器,处理对象依赖关系 IOC与DI: IOC :是一个容器,创建对象的容器 DI :在容器创建对象后,处理对象的依赖关系,也叫依赖注入! 方式1:通过set方法注入值 可以给普通属性.集合属性 ...

  2. Spring 学习之依赖注入

    什么是依赖关系? 纵观所有的Java 应用,从基于Applet的小应用到多层次结构的企业级别的应用,他们都是一种典型的依赖性应用,也就是由一些互相协作的对象构成的,Spring把这种互相协作的关系称之 ...

  3. Spring 学习笔记 ----依赖注入

    依赖注入 有三种方式,本文只学习下属性注入. 属性注入       属性注入即通过 setXxx方法()注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入方式是 ...

  4. Spring学习笔记--依赖注入

    依赖注入和控制反转:http://baitai.iteye.com/blog/792980出自李刚<轻量级 Java EE 企业应用实战> Java应用是一种典型的依赖型应用,它就是由一些 ...

  5. Spring学习(一)---依赖注入和控制反转

    Spring Spring是一个从实际开发中抽出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率. Spring为企业应用的开发提供 ...

  6. spring学习之依赖注入DI与控制反转IOC

    一 Ioc基础 1.什么是Ioc? Ioc(Inversion of Control)既控制反转,Ioc不是一种技术,而是一种思想,在Java开发中意味着将设计好的对象交给容器来进行控制,并不是像传统 ...

  7. spring学习 五 依赖注入的方式

    依赖注入有两种方式: 1 构造注入,如果<bean>标签下使用<contructor-arg>,则是构造注入 2 setter注入,就是调用setter方法注入,如果<b ...

  8. Spring学习--泛型依赖注入

    暂时没有搞懂.

  9. Spring学习(三)——Spring中的依赖注入的方式

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  10. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转

    Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...

随机推荐

  1. 从零开始写 Docker(九)---实现 mydocker ps 查看运行中的容器

    本文为从零开始写 Docker 系列第九篇,实现类似 docker ps 的功能,使得我们能够查询到后台运行中的所有容器. 完整代码见:https://github.com/lixd/mydocker ...

  2. debian12 出现Waiting for suspend/resume device ... Begin: Running /scripts/local-block ... done.

    /etc/initramfs-tools/conf.d/resume里对应的交换分区的uuid不正确 删除/etc/initramfs-tools/conf.d/resume 再运行 sudo upd ...

  3. 16 JavaScript逗号运算符

    16 JavaScript逗号运算符 Python 逗号运算符一般用于组合多个表达式,其返回值是最后一个表达式的值,例如: function s(){ console.log(1), console. ...

  4. #随机#CF1198F GCD Groups 2

    题目 将 \(n\) 个数分为两组,使得两组的GCD都为1,求具体的分组情况 分析 考虑直接打乱 \(n\) 个数,如果能使第一组GCD减小就减小,否则丢到第二组, 由于打乱后出错的概率会减小,所以r ...

  5. #KMP,矩阵乘法#洛谷 3193 [HNOI2008]GT考试

    题目 给定\(n,m,K\)和一个长度为\(m\)的数\(x\), 问有多少个\(n\)位数满足任意一段不与\(x\)完全相同,可含前导0 \(n\leq 10^9,m\leq 20\) 分析 设\( ...

  6. go~在阿里mse上使用redis.call

    相关依赖 github.com/higress-group/proxy-wasm-go-sdk github.com/alibaba/higress/plugins/wasm-go 标准的redis ...

  7. 使用OHOS SDK构建freetype

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone https://github.com/freetype/freetype.git ...

  8. 带你玩转OpenHarmony AI-基于海思NNIE的AI能力自定义

    简介 相信大家从玩转OpenAtom OpenHarmony(简称"OpenHarmony")AI系列专题的其他文章中,已经拓展了OpenHarmony AI在智慧出行.智慧办公等 ...

  9. C语言 03 原码 反码 补码

    原码 计算机中所有的数字都是使用 0 和 1 这样的二进制数来进行表示的. 这时如果要存储一个数据,比如十进制的 3,那么就需要使用 2 个二进制位来保存,二进制格式为 11,占用两个位置,称为 2 ...

  10. 空间音频技术与生态发展高峰论坛成功举办,业界首个Audio Vivid创作工具花瓣三维声亮相

    11月26日至27日,UWA世界超高清视频产业联盟(以下简称"UWA联盟").上海交通大学-南加州大学文化创意产业学院.华为联合举办了"互联智慧,共赢未来" 超 ...