04-Spring01-IOC
今日知识
1. Spring IOC控制反转(Inverse of control)
2. Spring DI依赖注入(Dependency Injection )
Spring
1. 概念:简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
2. Spring好处:
1. 方便解耦,简化开发: Spring就是一个大工厂,专门负责生成Bean,可以将所有对象创建和依赖关系维护由Spring管理
2. AOP编程的支持:
3. 申明事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程
4. 方便程序测试:Spring对Junit4支持,可以通过注解方便的测试Spring程序
5. 方便集成各种优秀框架: Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的支持
6. 降低javaAPI的使用的难度Spring: 对JavaEE开发中一些难用的API(JDBC、JavaMail、远程调webservice用等),都提供了封装,使这些API应用难度大大降低
IOC
1. 概念:所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。
所有的类的创建、销毁都由spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。
对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
DI依赖注入
1. 谁依赖了谁:应用程序依赖于IoC容器
2. 为什么要依赖:应用程序需要IoC容器来提供对象需要的外部资源
3. 谁注入谁:IoC容器注入应用程序某个对象,应用程序依赖的对象
4. 注入了什么:注入某个对象所需要的外部资源(包括对象、资源、常量数据)
IOC/DI入门案例
1. 导包:5+1四个核心一个依赖(spring5多一个)
* <dependency>
* <groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
* </dependency>
2. 新建类
3. 配置文件
4. 测试
装配Bean(xml)
1. 实例化Bean的三种方式
1. 使用构造方法实例化
* <!-- 第一种方式: new 实现类-->
<bean id="userService1" class="com.gyf.service.UserServiceImpl"></bean>
* public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans3.xml");
//new 对象
//IUserService userService1 = (IUserService) context.getBean("userService1");
//userService1.add();
2. 使用静态工厂方法实例化
* <!-- 第二种方式:通过静态工厂方法
spring的版本过低,3.0版本,把jdk改成1.7
-->
<bean id="userService2" class="com.gyf.service.UserSereviceFactory1" factory-method="createUserService"></bean>
//静态工厂
//IUserService userService2 = UserSereviceFactory1.createUserService();
//IUserService userService2 = (IUserService) context.getBean("userService2");
//userService2.add();
3. 使用实例工厂方法实例化
* <!--第三种方式:通过实例工厂方法 -->
<!-- 创建实例factory2 bean-->
<bean id="factory2" class="com.gyf.service.UserSereviceFactory2"></bean>
<bean id="userService3" factory-bean="factory2" factory-method="createUserService"></bean>
2. Bean的作用域
1. singleton:
* 在Spring IoC容器中仅存在一个Bean实例,Bean以单例方式存在,默认值
2. prototype:
* 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean()
3. request
* 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
4. session
* 同一个HTTP Session 共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicationContext 环境
5. globalSession
* 一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext 环境
依赖注入Bean属性(xml)
1. 手动装配,使用xml配置
1. 构造方法注入
2. 属性setter方法注入
2. 集合注入
1. 集合类型
集合的注入都是给<property>添加子标签
数组:<array>
List:<list>
Set:<set>
Map:<map> ,map存放k/v 键值对,使用<entry>描述
Properties:<props> <prop key=""></prop> 【】
JavaBean:对象注入,依赖<bean>标签注入
普通数据:<value>
引用数据:<ref>
2. 实例
3. <bean id="user" class="com.rqy.bean.User">
<property name="arrays">
<array>
<value>123</value>
<value>456</value>
</array>
</property>
<property name="users" >//存放对象
<list>
<bean class="com.cskaoyan.bean.User">
<property name="username" value="user1"/>
<property name="password" value="password1"/>
</bean>
<ref bean="secondUserInlist"/>
</list>
</property>
<property name="lists">
<list>
<value>123</value>
<value>456</value>
</list>
</property>
<property name="sets">
<set>
<value>123</value>
<value>456</value>
</set>
</property>
<property name="maps">
<map>
<entry key="1" value="123"/>
<entry key="2" value="456"/>
</map>
</property>
<property name="properties">
<props>
<prop key="1">123</prop>
<prop key="2">456</prop>
</props>
</property>
</bean>
3. 注解注入
1. 注解:就是一个类,使用@注解名称
2. 开发中:使用注解 取代 xml配置文件。
3. @Component 取代<bean class="">
4. @Component("id") 取代 <bean id="" class="">
5. web开发,提供3个@Component注解衍生注解(功能一样)取代<bean class="">
* @Repository(“名称”):dao层
* @Service(“名称”):service层
* @Controller(“名称”):web层
* @Autowired:自动根据类型注入
* @Qualifier(“名称”):指定自动注入的id名称
* @Resource(“名称”)
* @ PostConstruct 自定义初始化
* @ PreDestroy 自定义销毁
6. @Component
public class UserDaoImpl implements UserDao{
public String selectPasswordByName(String name) {
if ("zhangsong".equals(name))
{
return "jiaochunidemima";
}
return "ok";
}
}
@Component
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
public String queryPasswordByUsername(String name) {
return userDao.selectPasswordByName(name);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:application.xml")
public class mytest {
@Autowired
UserService userService;
@Resource(name="user1")
User user;
@Test
public void test(){
String s = userService.queryPasswordByUsername("123");
System.out.println(s);
}
}
04-Spring01-IOC的更多相关文章
- 04.Spring Ioc 容器 - 刷新
基本概念 Spring Ioc 容器被创建之后,接下来就是它的初始化过程了.该过程包含了配置.刷新两个步骤 . 刷新由 Spring 容器自己实现,具体发生在 ConfigurableApplicat ...
- 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- Spring IOC 源码简单分析 04 - bean的初始化
### 准备 ## 目标 了解 Spring 如何初始化 bean 实例 ##测试代码 gordon.study.spring.ioc.IOC04_Initialization.java publ ...
- Java开发工程师(Web方向) - 04.Spring框架 - 第2章.IoC容器
第2章.IoC容器 IoC容器概述 abstract: 介绍IoC和bean的用处和使用 IoC容器处于整个Spring框架中比较核心的位置:Core Container: Beans, Core, ...
- Spring-01 注解实现IOC
Spring框架四大原则 使用pojo进行轻量级和最小侵入式开发. 通过依赖注入和基于接口编程实现松耦合. 使用AOP和默认习惯进行声明式编程. 使用AOP和模板(template)减少模式化代码. ...
- Spring01——你应该了解的,有关 IOC 容器的一切
从本文开始,将开始介绍关于 Spring 的一些常见知识点.关注我的公众号「Java面典」,每天 10:24 和你一起了解更多 Java 相关知识点. 在如今的 Java Web 开发中,Spring ...
- Spring源码 04 IOC XML方式
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
- Spring 04: IOC控制反转 + DI依赖注入
Spring中的IOC 一种思想,两种实现方式 IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入 核心业务:(a)对象的创建 ...
- Spring----01. 入门知识,IoC/DI
1.spring两个最基本概念:依赖注入DI.面向切面AOP 2.spring通过上下文Application Context装配bean,实现方式的区别是如何加载它们的配置信息, ClassPath ...
- Spring的IOC和AOP之深剖
今天,既然讲到了Spring 的IOC和AOP,我们就必须要知道 Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例 ...
随机推荐
- kuangbin专题 专题九 连通图 POJ 3694 Network
题目链接:https://vjudge.net/problem/POJ-3694 题目:给定一个连通图,求桥的个数,每次查询,加入一条边,问加入这条边后还有多少个桥. 思路:tarjan + 并查集 ...
- DSN
用户DSN注册信息记录在本机的注册表上 文件DSN保存在本地磁盘上 系统DSN注册在服务器的注册表上,所以客户端连接服务器,只要一台在服务器建立了DSN,其他客户端登录时都会看到该DSN
- Go 每日一库之 cobra
简介 cobra是一个命令行程序库,可以用来编写命令行程序.同时,它也提供了一个脚手架, 用于生成基于 cobra 的应用程序框架.非常多知名的开源项目使用了 cobra 库构建命令行,如Kubern ...
- C#反射与特性(八):反射操作的示例大全
目录 1,InvokeMember 1.1 InvokeMember 参数 1.2 实践使用 InvokeMember 和成员的重载方法 微信平台,此文仅授权<NCC 开源社区>订阅号发布 ...
- ORM基础4 跨表查询+原子性操作
一.跨表查询 1.# # 正向查找 对象查找 # book_obj = models.Book.objects.get(id=3) # print(book_obj) # ret = book_obj ...
- [bzoj2152] [洛谷P2634] 聪聪可可
Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好 ...
- 常用API_1
API API(Application Programming Interface),应用程序编程接口.Java API是一本程序员的 字典 ,是JDK中提供给 我们使用的类的说明文档.这些类将底层的 ...
- Python学习,第一课 - 基础学习
前言. 本内容全部以python3所讲 一.Python安装 windows 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\pyth ...
- Can you answer these queries III(线段树)
Can you answer these queries III(luogu) Description 维护一个长度为n的序列A,进行q次询问或操作 0 x y:把Ax改为y 1 x y:询问区间[l ...
- redis5.0 Cluster集群搭建
安装redis sudo apt update sudo apt install build-essential tcl cd ~ mkdir document/ cd document/ curl ...