一、Spring是什么
通常说的Spring其实指的是Spring Framework,它是Spring下的一个子项目,Spring围绕Spring Framework这个核心项目开发了大量其他项目,比如Spring Security,Spring Data,Spring WebFlow等等。
Spring是为简化Java EE开发而生,而在Java EE中使用最多的就是Spring Framework,接下来我们主要就是学习Spring Framework。
Spring Framework包括他的核心解决方案IoC容器、Spring AOP。另外,还有对Web、数据访问层的支持。
下面是Spring Framework架构图:
 
二、Spring IoC容器
Spring IoC(Inversion of Control,控制反转)是Spring Framework的最核心的部分。
所谓控制反转,是指通过使用IoC容器对象依赖关系的管理被反转了,也就是说,对象之间的依赖关系由IoC容器进行管理,并且由Ioc容器通过依赖注入(DI,Dependency Injection)的方式来完成对象的注入。
 
在使用Spring的开发中,我们需要将所有的类在Spring的IoC容器中进行注册,告诉Spring你是什么,你需要什么,然后IoC容器会在你需要哪个对象时为你创建这个对象以及该对象依赖的其他对象实例(这就是依赖注入)。这些类的创建、销毁都会交由IoC容器来管理,而不再由引用它的对象维护。将以前的“对象-对象”的依赖模式转变为了“对象-IoC容器-对象”的依赖模式。
 
Spring提供了两种注册IoC容器的方式:XML方式和注解的方式。
 
三、Spring IoC的XML配置
1、添加Spring基本依赖包
aopalliance-1.0.jar
commons-logging-1.1.1.jar
spring-aop-3.2.0.RELEASE.jar
spring-beans-3.2.0.RELEASE.jar
spring-context-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
2、添加Spring配置文件applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6. <bean id="userDao" class="com.boya.spring.ioc.UserDao" />
  7. <bean id="exampleBean" class="com.boya.spring.ioc.ExampleBean">
  8. <property name="name" value="boya" />
  9. <property name="userDao" ref="userDao" />
  10. </bean>
  11. </beans>
3、分别创建User类和ExampleBean类
User类:

  1. public class UserDao {
  2. public String getName() {
  3. return "boya";
  4. }
  5. }
ExampleBean类:

  1. public class ExampleBean {
  2. private String name;
  3. private UserDao userDao;
  4. public void print(){
  5. System.out.println("Name is :"+name);
  6. }
  7. public void userPrint(){
  8. System.out.println("User name is :"+userDao.getName());
  9. }
  10. //省略getter、setter方法
  11. }
4、IoC容器测试

  1. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
  2. ExampleBean exampleBean = context.getBean("exampleBean", ExampleBean.class);
  3. exampleBean.print();
  4. exampleBean.userPrint();
    输出:
Name is :boya
User name is :boya
 
四、Spring IoC注解
Spring 的依赖配置方式与 Spring 框架的内核自身是松耦合设计的。然而,直到 Spring 3.0 以前,使用 XML 进行依赖配置几乎是唯一的选择。Spring 3.0 的出现改变了这一状况,它提供了一系列的针对依赖注入的注解,这使得 Spring IoC 在 XML 文件之外多了一种可行的选择。下面介绍如何使用这些注解进行依赖配置的管理。
 
我将注解分为两类,第一类用于属性装配,第二类用于类的注册。
 
属性装配使用的注解一般有两种,分别是Autowired、Resource。
@Autowired
1、@Autowired默认按照类型匹配的方式(byType)进行注入

3、@Autowired注解可以用于成员变量、setter方法、构造器函数等
4、使用@Autowired注解须有且仅有一个与之匹配的Bean,当找不到匹配的 Bean 或者存在多个匹配的Bean时,Spring 容器将抛出异常
5、Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称。@Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了
 
@Resource
1、@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,@Resource 默认按 byName 自动注入罢了
2、@Resource 有两个属性,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。
 
需要将某个类在IoC容器注册时,可以使用@Component、@Repository、@Service和 @Controller 
@Component
1、@Component是所有受Spring管理组件的通用形式,而@Repository、@Service和 @Controller则是@Component的细化, 用来表示更具体的用例(分别对应了持久化层、服务层和表现层)
2、使用@Component注解定义的Bean,默认的名称(id)是小写开头的非限定类名。如UserDao类定义的Bean名称就是userDao。你也可以指定Bean的名称: @Component("abc")
 
下面,我们把上面的示例改为注解配置的形式。
首先,需要修改配置文件applicationContext.xml,如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-3.0.xsd">
  9. <context:component-scan base-package="com.boya.spring.ioc" />
  10. </beans>
<context:component-scan />的base-package属性指定了需要扫描的类包,类包及其递归子包中所有的类使用的注解都会被处理。 
 
2、在类中添加注解
UserDao类:

  1. @Repository
  2. public class UserDao {
  3. public String getName() {
  4. return "boya";
  5. }
  6. }
ExampleBean类:

  1. @Service
  2. public class ExampleBean {
  3. @Resource
  4. @Value("boya")
  5. private String name;
  6. @Resource
  7. private UserDao userDao;
  8. public void print(){
  9. System.out.println("Name is :"+name);
  10. }
  11. public void userPrint(){
  12. System.out.println("User name is :"+userDao.getName());
  13. }
  14. }
前面介绍了,用于装配属性的注解@Autowired和@Service是可以用于成员变量的,所以当我们在成员变量设置这两个注解后,setter方法就可以去除了。
 
3、IoC容器测试

  1. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
  2. ExampleBean exampleBean = context.getBean("exampleBean", ExampleBean.class);
  3. exampleBean.print();
  4. exampleBean.userPrint();
输出结果:
Name is :boya
User name is :boya

Spring 教程(一)的更多相关文章

  1. Spring教程索引

    Spring教程索引 2016-11-15 1 入门 1 概述.深入浅出Spring(一)Spring概述 2 体系结构 3 环境设置 4 Hello World 实例 5 IoC 容器   IoC容 ...

  2. Spring教程:tutorialspoint-spring

    来自turorialspoint的Spring教程(英文),官网:https://www.tutorialspoint.com/spring/index.htm 这个教程在国内已经被翻译成中文(不过是 ...

  3. Spring教程检视阅读

    Spring教程检视阅读 地址 可供参考的教程 <菜鸟学 SSH> <Spring Boot 那些事> <初识 Spring Security> <Sprin ...

  4. 13、Spring教程之全部(包括所有章节)

    Spring 教程 1.Spring概述 简介 Spring : 春天 --->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架. ...

  5. Java系列教程-Spring 教程目录

    Spring 教程目录 可参考MyBatis的官方文档也比较清楚 https://mybatis.org/mybatis-3/zh/getting-started.html 代码 目录 https:/ ...

  6. HowToDoInJava Spring 教程·翻译完成

    原文:HowToDoInJava 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 学习资源 目录 Spring 5 Spr ...

  7. spring教程

    Spring框架是Java EE开发中最流行的框架,已经成为JEE事实上的标准,全世界的开发人员都在使用Spring框架开发各种应用.随着Spring boot,Spring cloud新版本的不断推 ...

  8. Spring 教程(二)

    一.Spring AOP介绍 开发其实就是在不断的重构,抽象重复代码,然后进行封装.从最原始的模块化编程到面向对象编程,代码的封装越来越整齐清晰,但是依然存在重复的代码,而这些重复代码几乎都是与业务逻 ...

  9. 【spring教程之二】spring注射剂xml构造方法参数

    1.上述续,假设你想注入bean当文件,传递给构造函数的参数.主要的变化是需要spring.xml配置文件来配置. <?xml version="1.0" encoding= ...

随机推荐

  1. 第二章 约束和排序数据(SQL基础)

    第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息:                注意:使用 between 下边界 and 上边界时,条件包括边界值: ...

  2. Matlab删除NaN数据

    删除包含NaN的行: a(any(isnan(a), 2),:) = []; 删除全部为NaN的行: a(all(isnan(a), 2),:) = [];

  3. 【BZOJ 1295】 [SCOI2009]最长距离

    Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格 ...

  4. ExtJs 自定义Vtype验证

    最近公司开发项目在用ExtJs,碰到验证的就大概的总结了一些常用的验证.自定义的验证主要有两种方式:一种是单字段的自定义验证,另一种是多字段间的验证.对于单字段的验证主要通过regex配置项指定自定义 ...

  5. PHP发送微信模版消息

    public function payResult($params) { global $_GPC, $_W; $weid = $this->_weid; $order = pdo_fetch( ...

  6. 使用SqlDataAdapter时,需要注意的几点

    1.SqlDataAdapter内部通过SqlDataReader获取数据,而默认情况下SqlDataReader不能获知其查询语句对应的数据库表名,所以下面的代码: string strConn,s ...

  7. Extjs4.2——Panel

    一.Panel的border属性: 示例: Ext.create('Ext.panel.Panel', { title: 'Hello', width: 200, height:100, border ...

  8. js和HTML结合(补充知识:如何防止文件缓存的js代码)

    来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(二) 使用html标签<script>可以把js嵌入到html页面中,让脚本 ...

  9. 汇编invoke和call的关系

    win32汇编里面,我们既可以用invoke也可以用call调用子程序/函数,不过invoke使用简单方便,所以绝大多数情况我们都用invoke. 但是很多人只是知道使用它,对它却不是很了解.我以前对 ...

  10. C++开源跨平台类库集

    在如下的库支持下,开发的系统可以很方便移植到当前大部分平台上运行而无需改动,只需在对应的平台下 用你喜欢的编译器 重新编译即可 经典的C++库   STLport-------SGI STL库的跨平台 ...