什么是Spring、IOC、AOP、DI?

    Spring是一个基于IOC和AOP的结构J2EE系统的框架。

    IOC(Inversion Of Control)控制反转(Spring的基础,创造对象由以前的程序员new构造方法来调用,变成交由Spring创建对象)

    AOP(Aspect Oriented Programming)面向切面编程 (在面向切面编程中,功能分为核心业务功能(登陆、增删改查)和周边功能(即切面,例如性能统计、日志、事务管理),两者可以独立开发,最后在通过配置文件进行交织在一起)

    DI(Dependency Injection)依赖注入(简单来说就是拿到了对象的属性,已经注入好相关值了,直接使用即可)

#第一部分:IOC、DI

1、首先创建一个pojo包,里面有个Product.java

  1. pack com.test.pojo
  2.  
  3. import ......
  4.  
  5. public class Product {
  6. private String name;
  7.  
  8. public void setName(String name) {
  9. this.name=name;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. }

2、在applicationContext.xml中配置Product的属性

  1. <?xml>
  2. <beans ......>
  3. <bean name="p" class="com.test.pojo.Product">
  4. <property name="name" value="天地一号">
  5. </bean>
  6. </beans>

3、测试类测试是否运行成功

  1. package com.test.test;
  2.  
  3. import com.test.pojo.Product;
  4.  
  5. public class TestSpring{
  6. ApplicationContext context = new ClassPathXmlApplicationContext(new String [] {"applicationContext.xml"});
  7. Product p = (Product) context.getBean("p");
  8. System.out.println(p.getName()); // 输出: 天地一号
  9. }

#第二部分:注入对象

1、在刚刚的基础基础之上,创建一个Category.java

  1. pack com.test.pojo
  2.  
  3. import ......
  4.  
  5. public class Category{
  6. private String name;
  7.  
  8. public void setName(String name) {
  9. this.name=name;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. }

2、在applicationContext.xml中追加配置Category这个bean对象

  1. <?xml>
  2. <beans ......>
  3. <bean name="p" class="com.test.pojo.Product">
  4. <property name="name" value="天地一号" >
  5. <property name="category" ref="c"> <!--DI体现:注入Category这个bean对象-->
  6. </bean>
  7. <bean name="c" class="com.test.pojo.Category">
  8. <property name="name" value="饮料类别">
  9. </bean>
  10. </beans>

3、测试类测试是否运行成功

  1. package com.test.test;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. // 注意,这里虽然用到了Category这个对象,但是不用导入包,因为在xml配置文件里面,早已经把Category注入到了Product这个bean对象当中!!!
  6. import com.how2java.pojo.Product;
  7.  
  8. public class TestSpring {
  9.  
  10. public static void main(String[] args) {
  11. ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
  12.  
  13. Product p = (Product) context.getBean("p");
  14.  
  15. System.out.println(p.getName()); // 输出:天地一号
  16. System.out.println(p.getCategory().getName()); // 输出:饮料类别
  17. }
  18. }

#第三部分:注解方式

为什么使用注解?

这是因为注解,能够减轻applicationContext.xml这个spring配置文件的代码负担,所以说,注解最大的好处是简化了XML的配置。要不然你写代码的时候,这边写java还要切换到xml那边再看类的配置是怎样的,这样开发效率太低了。

3.1 @Autowired的注解方式

1、首先,在xml文件中注释掉之前注入到Product类的Category类,然后在前面添加一行以下代码

  1. <context:annotation-config/> // 表示告诉Spring要用注解的方式进行配置

applicationContext.xml文件修改具体如下:

  1. <?xml>
  2. <beans....>
  3. <context:annotation-config/> // 加上这一行,表示告诉spring要用注解的方式进行配置
  4. <bean name="c" class="com.test.pojo.Category">
  5. <property name="name" value="category 1" />
  6. </bean>
  7. <bean name="p" class="com.test.pojo.Product">
  8. <property name="name" value="product1" />
  9. <!-- <property name="category" ref="c" /> --> //注释掉这一行
  10. </bean>
  11.  
  12. </beans>

2、直接在Product中,把Category放进去,加上get/set方法,然后@Autowired可以放在两处地方,具体如下修改Proudct类

  1. package com.test.pojo;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired; // 别忘了引入注解的包
  4.  
  5. public class Product {
  6.  
  7. private int id;
  8. private String name;
  9. @Autowired // 注解位置一 很强的地方在于,不用import Category 这个类!!!!
  10. private Category category;
  11.  
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public Category getCategory() {
  19. return category;
  20. }
  21. // @Autowired //注解位置2
  22. public void setCategory(Category category) {
  23. this.category = category;
  24. }
  25. }

  

3.2 @Resource的注解方式

说明:@Resource是J2ee的规范,而@Autowired

@Resources是J2ee的规范,而@Autowired是Spring 的规范,通过注解的形式把原本写在xml中的依赖替代,在xml中添加<context:annotation-config/>以通知Spring解析注解,简化操作;注解本质是一种标记,只是告知作用

  1. package com.test.pojo;
  2.  
  3. import javax.annotation.Resource; // 别忘了引入注解的包
  4.  
  5. public class Product {
  6.  
  7. private int id;
  8. private String name;
  9. @Resource(name="c")
  10. private Category category;
  11. ....
  12. ....
  13. }

  

3.3 对bean的注解 @Component

3.1和3.2的注解方式是对注入对象行为的注解,那么其实还有一种注解,可以直接对bean进行注解,意思是把Product、Category这些bean直接移出applicationContext.xml配置文件。

1、修改之前的applicationContext.xml,把之前写的东西全部删除掉,只需要新增下面这句:

  1. <?xml>
  2. <beans ...>
  3.  
  4. <context:component-scan base-package="com.test.pojo"/> // 告诉Spring,bean都放在com.test.pojo这个包下面了

2、因为applicationContext中已经没有配置bean的属性了,所以在Product、Category类中,需要自己自定义私有属性,并且在类的头部添加注解 @Component表明此类是bean如下:

Product.java

  1. package com.test.pojo;
  2.  
  3. import javax.annotation.Resource;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Component;
  6.  
  7. @Component("p") // 对bean的注解,表面此类是bean
  8. public class Product {
  9.  
  10. private String name="天地一号";
  11.  
  12. @Autowired // 注意注入还是少不了的!!
  13. private Category category;
  14.  
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public Category getCategory() {
  22. return category;
  23. }
  24. public void setCategory(Category category) {
  25. this.category = category;
  26. }
  27. }

Category.java

  1. package com.test.pojo;
  2.  
  3. import org.springframework.stereotype.Component;
  4.  
  5. @Component("c") // 对bean的注解,表面此类是bean
  6. public class Category {
  7.  
  8. private String name="饮料类别";
  9.  
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. }

3.4 对上面注解进行测试(同一个main函数,会发现运行结果是一样的)

  1. package com.test.test;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. import com.how2java.pojo.Product;
  7.  
  8. public class TestSpring {
  9.  
  10. public static void main(String[] args) {
  11. ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
  12. Product p = (Product) context.getBean("p");
  13. System.out.println(p.getName()); // 输出: 天地一号
  14. System.out.println(p.getCategory().getName()); // 输入:饮料分类
  15. }
  16. }

#第四部分:注解方式写Java单元测试(可忽略,有空可以了解

为什么要用到测试类?为什么要单元测试?

单元测试是编写测试代码,应该准确、快速保证程序基本模块的正确性

简单来说,就是类里面的方法就是一个单元,看看每一个方法是否正确,这个正确性的标准很广,它分很多方面,例如一个两数相加的方法add,给他一个用例,add(1,1),然后给它一个正确的答案2,看看计算出来的结果是否等于预期结果2。

这是一方面,另一方面,例如

限时测试

有时候,一些方法里面的逻辑非常复杂,循环嵌套比较深,很可能出现死循环,那你要怎么预防呢?限时测试可以帮到你。我们给测试函数设定一个执行时间,超过这个时间,就会被系统强行终止,然后系统会告诉你终止的原因是因为超时,这样就可发现这些Bug了。而且用JUnit很好实现,只需要给@Test添加一个timeout参数就行。

  1. @Test(timeout = 1000)

异常测试

java由抛出异常机制。如果有一个函数需要抛出自定的异常,但是它没抛出来,这就是一个BUG了。例如10除以0,理应抛出ArithmeticException.class异常,所以我们需要设置一个测试类来测试它到底有没有抛出异常,并且是不是我们想要的异常,JUnit也帮我们实现了,

  1. @Test(expected = ArithmeticException.class)

参数化测试

这个对测试人员非常有用,例如一个函数,它的参数有许多的特殊值,即有很多区域,例如“计算一个平方”这个函数,暂且分为三个区域:正数、0、负数,所以写测试的时候,需要在测试类里面至少写三个测试方法,但是JUnit的参数化测试,就简化了,只需要写一个方法就OK,原理是把参数数组塞进同一个方法体,让它自动执行就行。

  1. @Parameters
  2. public static Collection data() {
  3. return Arrays.asList(new Object[][]{
  4. {2, 4},
  5. {0, 0},
  6. {-3, 9},
  7. });
  8. }

  

测试类注解简单例子

  1. package com.test.test;
  2.  
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.test.context.ContextConfiguration;
  7. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  8.  
  9. import com.test.pojo.Category;
  10.  
  11. @RunWith(SpringJUnit4ClassRunner.class) // 表示这是一个Spring的测试类
  12. @ContextConfiguration("classpath:applicationContext.xml") // 定位Spring的配置文件
  13. public class AnnotationTest {
  14. @Autowired // 给测试类装配Category对象
  15. Category c;
  16.  
  17. @Test // 测试逻辑,打印c对象的名称
  18. public void test() {
  19. System.out.println(c.getName());
  20. }
  21. }

  

注:JUnit4是Java单元测试框架,已经在eclipse中默认安装,通过配置可以快捷地生成对应的测试类。

第四部分参考博客:https://www.cnblogs.com/happyzm/p/6482886.html

  

Spring基础学习,附例子代码讲解的更多相关文章

  1. spring基础学习01

    spring基础 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用 IOC控制反转 把创建对象和维护对象之间的关系权利 ...

  2. spring基础学习

    ClassXmlAplicationContext和FileSystemXmlApplicationContext的区别      https://www.cnblogs.com/sxdcgaq808 ...

  3. Spring基础学习(四)—AOP

    一.AOP基础 1.基本需求      需求: 日志功能,在程序执行期间记录发生的活动. ArithmeticCalculate.java public interface ArithmeticCal ...

  4. Spring基础学习(一)—初识Spring

    一.Spring的使用 1.导入jar包 2.编写实体类 Person.java public class Person{ private String name; public void say() ...

  5. 使用JavaConfig方式-Spring 基础学习

    在Spring的使用中,大量采用xml方式配置类之间的关系太过于繁琐(个人这么认为),而在学习了Spring4后发下使用JavaConfig方式来配置这些关系会更加的简单明了. 测试环境 1. Apa ...

  6. Spring基础学习笔记

    1. Spring入门 1. 1 Spring的体系结构 1.2 HelloWorld 1.2.1 Maven的使用 1)maven 的javase工程目录结构: 2)maven的settings.x ...

  7. js变量及其作用域(附例子及讲解)

    Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量   工具/原料   Ch ...

  8. Spring基础学习笔记-Bean的基础知识

    一. Bean的定义,初始化,使用和销毁 二.ref指定依赖的三种模式 三.Bean的五种自动装配模式(autowire) 四.Bean依赖检查的4种模式:配合atuowire使用,dependenc ...

  9. Spring基础学习(五)—事务管理

    一.事务基本认识 1.事务的概述      为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视 ...

随机推荐

  1. 网络流解线性规划问题 BZOJ1061: [Noi2008]志愿者招募

    线性规划定义: 在给定有限的资源和竞争约束情况下,很多问题都可以表述为最大化或最小化某个目标.如果可以把目标指定为某些变量的线性函数,而且如果可以将资源约束指定为这些变量的等式或不等式,则得到了一个线 ...

  2. BZOJ_1954_Pku3764 The xor-longest Path_Trie树

    Description 给定一棵n个点的带权树,求树上最长的异或和路径 把根到点路径上点权异或和求出来,然后变成了Trie树裸题.   代码: #include <cstdio> #inc ...

  3. BZOJ_3427_Poi2013 Bytecomputer_DP

    BZOJ_3427_Poi2013 Bytecomputer_DP Description 给定一个{-1,0,1}组成的序列,你可以进行x[i]=x[i]+x[i-1]这样的操作,求最少操作次数使其 ...

  4. linux yum命令 使用

    yum -y install 包名(支持*) :自动选择y,全自动 yum install 包名(支持*) :手动选择y or n yum remove 包名(不支持*) rpm -ivh 包名(支持 ...

  5. 伪元素before after

    什么是伪元素(Pseudo element)? 伪元素不是真正的元素,不存在与文档之中,所以js无法操作他.那为什么叫他"元素"?因为我们可以对其进行跟元素几乎无差别的操作. 伪元 ...

  6. Android 7.0 启动篇 — init原理(二)(转 Android 9.0 分析)

    ========================================================          ================================== ...

  7. php架构之路

    鉴于最近跟小伙伴聊了很多PHP架构发展方向的问题,相关技术整理了一下,也顺便规划了一下自己的2019年. 一.常用的设计模式以及使用场景 以下是我用到过的   工厂,单例,策略,注册,适配,观察者,原 ...

  8. python接口自动化(十六)--参数关联接口后传(详解)

    简介 大家对前边的自动化新建任务之后,接着对这个新建任务操作了解之后,希望带小伙伴进一步巩固胜利的果实,夯实基础.因此再在沙场实例演练一下博客园的相关接口.我们用自动化发随笔之后,要想接着对这篇随笔操 ...

  9. flutter初体验

    flutter初体验 和flutter斗争了两个周末,基本弄清楚了这个玩意的布局和一些常用组件了. 在flutter里面,所有东西都是组件Widget.我们像拼接积木一样拼接Widget,拼接的关键词 ...

  10. 使用Rotativa在ASP.NET Core MVC中创建PDF

    在本文中,我们将学习如何使用Rotativa.AspNetCore工具从ASP.NET Core中的视图创建PDF.如果您使用ASP.NET MVC,那么Rot​​ativa工具已经可用,我们可以使用 ...