• 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. 运行xxl-job,整合xxl-job至jeecg-boot项目

    1.前言:xxl-job是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 源码仓库地址:https://gitee.co ...

  2. MemfireCloud让静态托管页面动起来!

    静态托管 我们最常接触到的静态托管是github pages,它的常见工作模式是在github上创建一个仓库,使用hexo类的工具初始化仓库,编写markdown文件,生成静态页面,推送到github ...

  3. 【已解决】MySQL5.x和MySQL8.x 密码验证的区别(修改MySQL数据库密码的验证方式)

    mysql5.x使用的是 mysql_native_password mysql8.x使用的是 caching_sha2_password 1. 进入mysql mysql -u root -p 2. ...

  4. 解锁OpenHarmony技术日!年度盛会,即将揭幕!

    OpenHarmony技术日 即将揭幕!4月25日(星期一)09:00-18:00与你惊喜相约!     扫码直达   共建新技术.开拓新领域 OpenHarmony 工作委员会+7 家单位共同发起 ...

  5. NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL]

    NL2SQL基础系列(1):业界顶尖排行榜.权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL.Text2DSL] Text-to-SQL(或者Text2S ...

  6. 【7】SpringBoot是什么?SpringBoot的优缺点有哪些?

    随着动态语言的流行(Ruby.Groovy.Scala.Node.js),Java 的开发显得格外的笨重,繁多的配置.低下的开发效率.复杂的部署流程以及第三方技术集成难度大. 在上述环境下,Sprin ...

  7. 使用JSZip实现在浏览器中操作文件与文件夹

    1. 引言 浏览器中如何创建文件夹.写入文件呢? 答曰:可以借助JSZip这个库来实现在浏览器内存中创建文件与文件夹,最后只需下载这个.zip文件,就是最终得结果 类似的使用场景如下: 在线下载很多图 ...

  8. 顺通鞋服进销存OA管理系统

    鞋服进销存OA管理系统通过十几年的积淀与创新,顺通与众多鞋服企业一起共创,形成了涵盖协同办公.移动办公.知识管理.数据运营.多维门户等领域,以鞋服新品研发管理.生产排班管理.门店一体化管理.市场费用管 ...

  9. 本地使用ts配置

    1.需要安装的依赖 "dependencies": { "html-webpack-plugin": "^5.5.0", "ts- ...

  10. 力扣138(java)- 复制带随机指针的链表(中等)

    题目: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点. 构造这个链表的 深拷贝. 深拷贝应该正好由 n 个 全新 节点组成,其 ...