Srping的IOC
XML方式:
IOC:控制反转的底层原理就是:工厂模式+反射+配置文件
DI:依赖注入就是通过配置文件设置属性值
BeanFactory 是老版本的工厂类:调用getBean的时候,才会生成类的实例
ApplicationContext 是新版本的工厂类:加载配置文件的时候,就会将Spring管理的类都实例化
ApplicationContext有两个实现类:
ClassPathXmlApplicationContext :加载类路径下的配置文件
FileSystemXmlApplicationContext :加载文件系统下的配置文件
<bean>标签
id 使用了约束中的唯一约束,里面不能出现特殊字符
name 没有使用约束中的唯一约束(理论上可以重复,实际开发中不能出现重复),可以出现特殊字符
bean生命周期的配置
init-method:Bean被初始化的时候执行的方法
destroy-method: Bean被销毁的时候的方法(Bean是单例创建,工厂关闭)
Bean作用范围的配置:
scope Bean的作用范围
singleton 默认的,Spring会采用单例模式创建这个对象
prototype 多例模式,用一次new一个(Struts2和spring整合的时候一定会用到)
P名称空间的属性注入
普通属性 p:属性名="值"
对象属性 p:属性名-ref="值"
代码如下
public interface UserService {
public void save();
}
public class UserServiceImpl implements UserService {
private String name;
private String age;
private String price;
private Student student;
public void setName(String name) {
this.name = name;
}
public void setAge(String age) {
this.age = age;
}
public void setPrice(String price) {
this.price = price;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public void save() {
System.out.println("save..name=" + name + ";age=" + age + ";price=" + price + ";student=" + student);
}
public void init() {
System.out.println("init");
}
public void destroy() {
System.out.println("destroy");
}
}
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set; public class Student {
private String name;
private String[] arrs;
private List<String> list;
private Set<String> set;
private Map<String, String> map; public void setName(String name) {
this.name = name;
} public void setArrs(String[] arrs) {
this.arrs = arrs;
} public void setList(List<String> list) {
this.list = list;
} public void setSet(Set<String> set) {
this.set = set;
} public void setMap(Map<String, String> map) {
this.map = map;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", arrs=" + Arrays.toString(arrs) +
", list=" + list +
", set=" + set +
", map=" + map +
'}';
}
}
配置文件
ApplicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDAO" class="com.jinke.demo.UserServiceImpl" init-method="init" destroy-method="destroy"
p:age="30" p:price="2000" p:student-ref="student">
<property name="name" value="李东"/>
</bean>
<import resource="ApplicationContext2.xml"/>
</beans>
ApplicationContext2.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="student" class="com.jinke.demo.Student" p:name="学生">
<property name="arrs">
<list>
<value>张三</value>
<value>李四</value>
<value>王五</value>
</list>
</property>
<property name="list">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
<property name="set">
<set>
<value>a</value>
<value>b</value>
<value>c</value>
</set>
</property>
<property name="map">
<map>
<entry key="1" value="a"/>
<entry key="2" value="b"/>
<entry key="3" value="c"/>
</map>
</property>
</bean> </beans>
执行
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringDemo1 { @Test
public void demo() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userDAO");
userService.save();
((ClassPathXmlApplicationContext) applicationContext).close();
}
}
得到结果
save..name=李东;age=30;price=2000;student=Student{name='学生', arrs=[张三, 李四, 王五], list=[1, 2, 3], set=[a, b, c], map={1=a, 2=b, 3=c}}
六月 11, 2019 6:40:17 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@6842775d: startup date [Tue Jun 11 18:40:16 CST 2019]; root of context hierarchy
destroy
注解的方式
Spring包括的模块
web层:springmvc
service层:bean管理,声明式事物
DAO层:ORM模块、jdbc模板
IOC注解方式,可以不提供set方法
属性如果有set方法,注解添加到set方法上,没有set方法就添加到属性上
注解详解
@Component:组件
衍生:@Controller web层的类、@Service service层的类、@Repository DAO层的类(一般用这个)
普通属性:@Value
对象属性:@Autowired 习惯是和@Qualifier一起使用
@Resource(一般用这个)
生命周期相关注解
@PostConsruct 初始化
@PreDestroy 销毁
Bean作用范围
@Scope(singleton/prototype)
代码如下
public interface UserDAO {
public void save();
}
public interface UserService {
public void save();
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource; @Repository(value = "userDao")//相当于<bean id = "userDao" class="com.jinke.demo1.UserDAOImpl"/>
public class UserDAOImpl implements UserDAO {
@Value("大傻")
private String name; /*@Value("大傻")
public void setName(String name) {
this.name = name;
}*/
/*@Autowired
@Qualifier(value = "userService222")*/
@Resource(name = "userService222")
private UserService userService; @Override
public void save() {
System.out.println("UserDAOImpl被执行了--name=" + name);
userService.save();
} @PostConstruct//相当于init-method
public void init() {
System.out.println("UserDAOImpl被执行了init");
} @PreDestroy//相当于destroy-method
public void destroy() {
System.out.println("UserDAOImpl被执行了destroy");
} }
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service; @Service("userService222")
@Scope("singleton")
public class UserServiceImpl implements UserService {
@Override
public void save() {
System.out.println("UserServiceImpl的save被执行了");
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.jinke.demo1"/>
</beans>
执行
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Demo1 {
@Test
public void demo1() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext3.xml");
UserDAO userDao = (UserDAO) applicationContext.getBean("userDao");
userDao.save();
((ClassPathXmlApplicationContext) applicationContext).close();
}
}
输出结果
UserDAOImpl被执行了init
UserDAOImpl被执行了--name=大傻
UserServiceImpl的save被执行了
六月 12, 2019 4:25:36 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@6842775d: startup date [Wed Jun 12 16:25:36 CST 2019]; root of context hierarchy
UserDAOImpl被执行了destroy
总结:一般XML用来管理Bean,注解完成属性注入
欢迎关注我的微信公众号:安卓圈

Srping的IOC的更多相关文章
- 基于XML的AOP配置
创建spring的配置文件并导入约束 此处要导入aop的约束 <?xml version="1.0" encoding="UTF-8"?> < ...
- spring_three
转账案例 坐标: ; } } 创建增强类Logger.java /** * 用于记录日志的工具类,它里面提供了公共的代码 */ @Component("logger") @Aspe ...
- JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP、IOC)
接上篇<JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构.调试.部署>,通过一个简单的JSP WEB网站了解了JAVA WEB相关的知识,比如:Ser ...
- Spring核心——设计模式与IoC
“Spring”——每一个Javaer开发者都绕不开的字眼,从21世纪第一个十年国内异常活跃的SSH框架,到现在以Spring Boot作为入口粘合了各种应用.Spring现在已经完成了从web入口到 ...
- Spring IOC容器创建bean过程浅析
1. 背景 Spring框架本身非常庞大,源码阅读可以从Spring IOC容器的实现开始一点点了解.然而即便是IOC容器,代码仍然是非常多,短时间内全部精读完并不现实 本文分析比较浅,而完整的IOC ...
- Spring学习笔记之The IoC container
IoC is also known as dependency injection (DI). 这是一个过程?什么样的过程呢?对象自己定义它的依赖关系,这意味着,那些他们依赖的对象,只能通过构造函数参 ...
- Spring—Ioc
IoC容器,最主要的就是完成对象的创建以及维护对象的依赖关系等. 所谓控制反转,包括两部分:一是控制,二是反转,就是把传统方式需要由代码来实现对象的创建.维护对象的依赖关系,反转给容器来帮忙管理和实现 ...
- Spring 的IOC容器之XML方式
1. Spring 入门 1.1 概述 Spring 是一个分层的 JavaEE 轻量级开源框架; Spring 的核心是控制反转(IOC)和面向切面(AOP); 1.2 特点 方便解耦,简化开发; ...
- Spring总结一:Srping快速入门
Sping是什么: Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的J ...
随机推荐
- beta冲刺(4/7)
作业格式 课程名称:软件工程1916|W(福州大学) 作业要求:项目beta冲刺(团队) 团队名称: 那周余嘉熊掌将得队 作业目标:beta(4/7) 队员学号 队员姓名 博客地址 备注 221600 ...
- hbase与Hive的集成
1 HBase与Hive的对比 1.Hive (1) 数据仓库 Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询. (2) 用于数据分析. ...
- 本地项目git到github上
步骤: 1.下载git,安装完成后到桌面右击鼠标会出现git的选项 2.创建一个本地仓库用来存储你的本地项目,我在D盘创建一个reposity的文件夹 3.在reposity文件夹打开git命令行,输 ...
- Linux计划作业练习
1.crontab -eu zh //每天晚上10天提醒用户可以去睡觉了 * */10 * * * go to sleep 2.查询crontab的工作内容 3.当crontab命令格式出错时 ...
- LeetCode 1156. Swap For Longest Repeated Character Substring
原题链接在这里:https://leetcode.com/problems/swap-for-longest-repeated-character-substring/ 题目: Given a str ...
- 洛谷 P2577 [ZJOI2005]午餐 题解
每日一题 day56 打卡 Analysis 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个 ...
- python的虚拟环境管理工具venv使用方法介绍及与nodejs的包管理方式对比
一.nodejs 包管理方式 我们知道, nodejs的包管理工具npm可以安装项目所需要的包,安装方法及区别如下: npm i module_name -g 全局安装 npm i module_na ...
- MySQL中列别名为中文时,Order by 子句中使用别名时不要加引号
暂时还不清楚原因 1.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 SC表: 这里,当做总成绩处理 select sid, sum(score) as '总成绩', avg(score) ...
- [NOIP2013]华容道 题解
[NOIP2013]华容道 首先是一种比较显然的做法. 整个棋盘,除了起点,终点和空格,其他的方块是等价的. 对于终点,它始终不会变化,如果搜到终点结束搜索即可,所以我们不需要考虑终点. 所以需要考虑 ...
- 修改Docker容器启动配置参数
有时候,我们创建容器时忘了添加参数 --restart=always ,当 Docker 重启时,容器未能自动启动, 现在要添加该参数怎么办呢,方法有二: 1.Docker 命令修改 docker c ...