今日知识

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的更多相关文章

  1. 04.Spring Ioc 容器 - 刷新

    基本概念 Spring Ioc 容器被创建之后,接下来就是它的初始化过程了.该过程包含了配置.刷新两个步骤 . 刷新由 Spring 容器自己实现,具体发生在 ConfigurableApplicat ...

  2. 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 ...

  3. Spring IOC 源码简单分析 04 - bean的初始化

      ### 准备 ## 目标 了解 Spring 如何初始化 bean 实例 ##测试代码 gordon.study.spring.ioc.IOC04_Initialization.java publ ...

  4. Java开发工程师(Web方向) - 04.Spring框架 - 第2章.IoC容器

    第2章.IoC容器 IoC容器概述 abstract: 介绍IoC和bean的用处和使用 IoC容器处于整个Spring框架中比较核心的位置:Core Container: Beans, Core, ...

  5. Spring-01 注解实现IOC

    Spring框架四大原则 使用pojo进行轻量级和最小侵入式开发. 通过依赖注入和基于接口编程实现松耦合. 使用AOP和默认习惯进行声明式编程. 使用AOP和模板(template)减少模式化代码. ...

  6. Spring01——你应该了解的,有关 IOC 容器的一切

    从本文开始,将开始介绍关于 Spring 的一些常见知识点.关注我的公众号「Java面典」,每天 10:24 和你一起了解更多 Java 相关知识点. 在如今的 Java Web 开发中,Spring ...

  7. Spring源码 04 IOC XML方式

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

  8. Spring 04: IOC控制反转 + DI依赖注入

    Spring中的IOC 一种思想,两种实现方式 IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入 核心业务:(a)对象的创建 ...

  9. Spring----01. 入门知识,IoC/DI

    1.spring两个最基本概念:依赖注入DI.面向切面AOP 2.spring通过上下文Application Context装配bean,实现方式的区别是如何加载它们的配置信息, ClassPath ...

  10. Spring的IOC和AOP之深剖

    今天,既然讲到了Spring 的IOC和AOP,我们就必须要知道 Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例 ...

随机推荐

  1. dp - 递推

    C. Multiplicity time limit per test 3 seconds memory limit per test 256 megabytes input standard inp ...

  2. 继承Exception⭐⭐

    public class ECOrderException : Exception { //第一种类型: throw new ECOrderException { ErrorCode = " ...

  3. struts2 convention插件

    1.struts2自2.1以后推荐使用Convention Plugin支持struts零配置支持(引入jar:struts2-convention-plugin-2.x.x.jar)①convent ...

  4. NameError:name ‘xrange’ is not defined

    原因: 在Python 3中,range()与xrange()合并为range( ). 我的python版本为python3.5. 解决办法: 将xrange( )函数全部换为range( ).

  5. crawler 听课笔记 碎碎念 2 一些爬虫须知的基本常识和流程

    html的宗旨:      <标签 属性=”属性的值“></标签>        只是对于文本的一种解释划分吧 dom的宗旨:      就是一个大数组,处理方便,效率低 xm ...

  6. 个人第四次作业Alpha2版本测试~顾毓

    个人第四次作业Alpha2版本测试 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/ 这个作业要 ...

  7. django用户认证的session的应用

    from django.shortcuts import render,redirect def login(request): if request.method=='GET': return re ...

  8. vuex源码简析

    前言 基于 vuex 3.12 按如下流程进行分析: Vue.use(Vuex); const store = new Vuex.Store({ actions, getters, state, mu ...

  9. 13、FrameRely

    Frame Relay 美国国家标准化协会(American National Standard Institute,简称ANSI)国际电信联盟远程通信标准化组 ITU-T 1.是由ITU和ANSI制 ...

  10. C指针右左法则

    摘录的别人的:  C语言所有复杂的指针声明,都是由各种声明嵌套构成的.如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法.不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出 ...