watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

Spring作为企业Java最流行的应用程序开发框架,已经被数以百万计的世界各地的开发人员使用,Spring框架用来创建高性能,易于测试的,可重用的代码。是一个开源的Java平台,它最初是由Rod Johnson编写并在2003年6月在Apache2.0许可下首次发布。由于是轻量级的,当涉及到大小和透明度。spring框架的基本版本是大约2MB。核心功能可以在任何Java应用程序中使用,但也有扩展的Java EE平台上构建Web应用程序。Spring框架的目标,以使J2EE开发更容易使用,并且通过使基于POJO的编程模型,促进良好的编程习惯。本文将带你了解Spring框架的基本使用,方便在工作中更好的了解其原理。

1:Spring在开发中的作用是什么? 

Spring的主要作用是整合第三方的框架、为Service层提供事务

2:传统的MVC的开发模式

     M:Model  (pojo+Service+DAO)

 

     V:View    (jsp、HTML)

 

     C:Controll  (Servlet、SpringMVC、struts)

 

    在传统的开发中:我们在Servlet中需要调用Service、在Service中需要调用DAO

    我们可以间接性的认为  Servlet---->Service----->DAO

 

    在我们的开发中Service的创建、DAO的创建、是由程序员直接或者间接性的完成了对象的创建工作

 

    我们的对象创建是由程序员去完成的?依赖关系是由程序员去管理的?

 

    我们的对象的创建能不能交给第三方去完成呢?我们的依赖关系能不能由第三方去进行维护呢?

 

    Spring的出现正好解决了这个问题.......

3:Spring是什么?

     Spring就是有关管理对象的创建以及管理对象之间的依赖关系的这样一门技术

     也就是说使用了Spring之后 我们的对象的创建可以由Spring来完成、对象之间的依赖关系也可以由Spring来进行维护  

  

4:Spring能干什么?

      4.1:Spring管理对象之间的依赖关系

 

      4.2:为Service层提供事务

 

      4.3:整合第三方框架

 

      4.4:提供了DAO层的解决方案

 

      4.5:提供了控制器的解决方案

 

      4.6:提供了对Web的支持

 

      4.7:提供了对上下文的支持

 

5:Spring的家族产品有哪些

     Spring     SpringMVC    Spring Security   Spring data   Spring Boot    Spring Cloud

 

6:Spring中的七大模块

     Spring Core:这个模块是Spring的核心模块  主要功能就是IOC/DI  提供的就是Spring的核心容器 IOC

 

     Spring AOP:这个模块的主要功能是提供了面向切面编程

 

     Spring ORM:这个包的主要功能是 提供了 整合第三方ORM框架的包

 

     Spring Web:这个包的主要功能就是 提供了对Web的支持

 

     Spring WebMVC:SpringMVC  (SpringMVC不是一个框架是Spring中的一个模块而已)

 

     SpringDAO:这个模块的主要功能就是 提供了对数据库的访问

 

     Spring Context:认证、邮件、EJB、UI

7:Spring的第一个HelloWorld程序

7.1:导包

   主要导入的是Spring的核心功能包 Spring Core

7.2:编写实体类

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

7.3:编写配置文件

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

7.4:测试

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

8:Spring中的IOC的使用(配置文件)

8.1:无参数的对象的创建的配置文件的编写

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 8.2:有参数的对象的创建

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  8.3:配置文件的玩法

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

8.4:工厂类的创建

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

8.5:工厂中非静态的方法创建JAVA对象

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

8.6:工厂中静态方法创建JAVA对象

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

总结下:IOC

   IOC:控制反转

   谁控制了谁? 

    Spring的IOC容器控制了对象的创建

    什么东西反转了?

    以前我们需要自己创建JAVA对象  现在 创建对象的这个权利反转了、创建对象的这个权利交给了Spring去完成

9:Spring中的DI

   DI:依赖注入

   谁依赖于谁?

    Controll依赖于Service   Service依赖于DAO

   注入了什么东西?

    1:注入具体的对象     2:注入了实际的值

 

9.1:set注入(可能是以前用的最多的一种方式)

9.1.1:在需要注入对象的类里面添加set方法

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

9.1.2:编写配置文件

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

9.2:P标签注入

前提:在约束中必须有:xmlns:p="http://www.springframework.org/schema/p"

          9.2.1:必须在需要注入对象的地方编写set方法

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

9.2.2:在配置文件中进行注入

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

9.3:内部bean进行注入

     9.3.1:在类中申明set方法

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

9.3.2:编写配置文件

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

9.4:自动装配

   9.4.1:全局实现自动装配

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

    9.4.2:局部实现自动装配

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

注意:如果是通过类型来实现自动装配的话那么注入的对象在IOC的容器中,必须只有一个实例、如果有多个实例的话那么就造成了 不知道注入那个对象了(报错)、通过名字进行装配的时候 那么只要对象的名字一致那么就不会报错了、不管是哪种注入方式那么set方法都是必须要写的

10:获取对象的三种形式

 10.1:通过类型来获取

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 10.2:通过名字来获取

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 10.3:通过id来获取

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

11:通过注解的形式来玩下IOC和DI

 要记住如下的注解

 

@Component:这个表示的是将当前的类的实例化对象放到IOC容器里面

@Service :语义化的Component一般用于Service上面 意义跟上面是一样的

@Repository:语义化的Component一般用于DAO上面  意义跟上面一样

@Scope:这个用来设置当前的这个类是单例的还是多例的

@PostConstruct:这个表示的意思是:当前类对象放到IOC容器的时候执行的初始化方法

@PreDestroy:这个表示的是对象在IOC容器中销毁的时候要执行的方法(资源回收)

@Autowired:这个表示的是根据类型(type)实现自动注入

@Resource:这个表示的是通过名字进行注入

 

注意:在类上面使用 @Component、@Service、@Repository的时候 默认的对象的名字就是当前的类的名字的首字母小写  

 

@Component、@Service、@Repository三个注解的意义是一样的、在实际开发中 Service层一般使用@Service、DAO层一般使用@Repository、如果其他的对象我们需要让IOC容器来实现自动管理的话那么 一般情况下使用@Component

 

如果在开发中实在记不住注解 你可以都使用@Component来实现对象放入IOC容器 并让Spring来实现管理

 

12:AOP的使用

  AOP:面向切面的编程

  什么叫面向切面的编程?就是将软件开发的过程中 遇到的重复代码抽取出来形成一个专门的类 这个类就叫做切面类,在软件的正常的运行过程中 需要使用我们抽取出来的重复代码的时候 通过代理的设计模式 动态的植入我们的重复代码的这种编程的思想 就叫做面向切面编程

 

   AOP编程的最大的用处:做风险控制、用户的行为记录、用户的行为日志 一般在做的时候是做成表

    系统的运行日志:这个日志一般是吸入到我们的文件中

12.1:传统模式的使用

12.1.1:编写我们的DAO类

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

12.1.2:编写业务逻辑类

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

12.1.3:编写切面类

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

12.1.4:测试

12.2:使用的是cglib代理来实现aop的使用

12.2.1:编写UserDAO的类(同上)

12.2.2:编写UserService的类

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

12.2.3:编写代理类(UserServiceProxy)

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

12.2.4:测试

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

12.3:AOP中注解模式的使用

常见的注解:

@Component          //第一步:将AOP类放入到IOC容器

@Aspect             //表明当前的类是一个切面类

@Scope(value="singleton")   //切面类一般在类中都是单例的

@Pointcut(value="execution (* com.qf.aop1.UserService.*(..))")          //这个里面编写的表达式就称为 切入点表达式

@Around(value="pt()")       //环绕的意思  在方法执行的前后来进行执行

@AfterReturning(value="pt()")    //在方法执行完成之后执行

@AfterThrowing(value="pt()")    //方法出现异常的时候执行

@Before(value="pt()")        //在切入点表达式的位置的方法执行之前执行的代码  后面的value表示的是在某一个地方去执行这个方法

@After(value = "pt()")        //方法执行之后进行执行

 

 12.3.1:AOP配置文件的使用

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

12.4:AOP的配置模式的使用

   12.4.1:将所有的注释给弄掉

   12.4.2:编写配置文件

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

   12.4.3:测试(同上)

13:Spring中DAO模块的使用(JdbcTemplate的使用)

Spring中的这个DAO模块的主要功能是:就是提供了数据库的功能访问、类似于dbutils

只不过是Spring这个框架提供的一种访问数据库的功能而已(基本不用)

 

13.1:导包

     C3P0的包

     mysql的驱动包

     Spring的核心功能包

     Spring的DAO的包

13.2:编写配置文件

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

13.3:在DAO中使用jdbcTemplate完成数据库的操作

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

13.4:测试(同上)


14:  事务

14.1:通过配置的方式来实现事务

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


测试:详情见代码(注意:你可以通过设置异常来看 事务是否起作用)
 

14.2:通过注解的模式来实现事务

14.2.1:配置文件的编写

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

14.2.2:在Service中配置事务的使用

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

14.2.3:测试的使用

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

15:注意事项

     15.1:生产环境中事务是不能加在DAO层的、所有的事务处理都是加在Service层的、因为一个业务是否成功 才表示了当前的操作是否是成功的

     15.2:如果开发中事务不回滚  那么你就手动的抛出一个运行时异常 这样事务就会回滚了

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

如果你觉得浅羽的文章对你有帮助的话,请在微信搜索并关注「 浅羽的IT小屋 」微信公众号,我会在这里分享一下计算机信息知识、理论技术、工具资源、软件介绍、后端开发、面试、工作感想以及一些生活随想等一系列文章。所见所领,皆是生活。慢慢来,努力一点,你我共同成长...

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

我建立了一个技术群,如果你想了解到更多关于IT行业的技术以及生活中遇到的问题,欢迎小伙伴进群交流,只需添加我的微信,备注进群即可,期待你们的加入。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

往期推荐

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

Java泛型需要注意的问题


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

如何在Java中创建优雅的对象来提升程序性能


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

多图,一文了解 8 种常见的数据结构


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

干货!MySQL优化原理分析及优化方案总结


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

硬核!15张图解Redis为什么这么快


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

自媒体人必不可少的多平台同步、一文多发小助手


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

程序员必备的技术网站合集


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

关于图片处理的那些事


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

浅羽

留言区

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

点个赞,证明你还爱我