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实例 ...
随机推荐
- 低功耗蓝牙(BLE)——概述
1. 概述 蓝牙协议是由SIG制定并维护的无线通信协议,蓝牙协议栈是蓝牙协议的具体实现.各厂商都根据蓝牙协议实现了自己的一套函数库--蓝牙协议栈,所以不同厂商的蓝牙协议栈之间虽然存在差别,但是都遵 ...
- 晨叔技术晨报: 你真的搞懂JS中的“值传递”和“引用传递”吗?
晨叔周刊,每周一话题,技术天天涨. 本周的话题是JS的内存问题(加入本周话题,请点击传送门). 图 话题入口 今天的技术晨报来,就来谈谈JS中变量的,值传递和引用传递的问题.现在,对于很多的JSer来 ...
- Python Global和Nonlocal的用法
nonlocal 和 global 也很容易混淆.简单记录下自己的理解. 解释 global 总之一句话,作用域是全局的,就是会修改这个变量对应地址的值. global 语句是一个声明,它适用于整个当 ...
- 02.flask-script
网址:https://pypi.org/project/Flask-Script/ 文档:https://flask-script.readthedocs.io/en/latest/ 1.安装 2.新 ...
- 6.反编译 java---class (字节码文件)---反编译(IDEA):
- web api 的 安全 认证问题 , 对外开放 的 时候 需要考虑到安全的问题
关于 OWIN OAuth , web api的认证,全局验证, 安全方面的验证 有必要 去 自己捣鼓一下.
- 指定表单使用的路由 Specifying the Route Used by a Form
- livego+obs+flv.js 搭建视频直播
一.流程 主播通过 obs软件通过直播 ->推流到->直播服务器 客户通过浏览器 访问站点->flv.js拉取直播服务器视频流并播放 二.环境 centos7 直播服务器 https ...
- PTA 练习 7-24 喊山 (30 分)
7-24 喊山 (30 分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的& ...
- DRF框架之Serializer序列化器的序列化操作
在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer. 今天,我们就先来学习一下Serializer序列化器. 使用Serializer序列化器的开发步骤 ...