Spring Data JPA初使用 *****重要********

Spring Data JPA初使用

  我们都知道Spring是一个非常优秀的JavaEE整合框架,它尽可能的减少我们开发的工作量和难度。

  在持久层的业务逻辑方面,Spring开源组织又给我们带来了同样优秀的Spring Data JPA。

  通常我们写持久层,都是先写一个接口,再写接口对应的实现类,在实现类中进行持久层的业务逻辑处理。

  而现在,Spring Data JPA帮助我们自动完成了持久层的业务逻辑处理,我们要做的,仅仅是声明一个持久层接口。

 

  1、下载开发所需要的发布包。

    1)spring-framework-3.1.2.RELEASE-with-docs.zip  

      下载地址:http://www.springsource.org/spring-framework

    2)hibernate-release-4.1.6.Final.zip

      下载地址:http://olex.openlogic.com/packages/hibernate

    3)Spring Data JPA

      Spring Data JPA

        下载地址:http://www.springsource.org/spring-data/jpa

      Spring Data Commons

        下载地址:http://www.springsource.org/spring-data/commons

    4)其他一些依赖包可以从 http://ebr.springsource.com/repository/app/library 上查找下载

 

  2、新建一个Web项目 spring-data-jpa,把相应的jar包放到/WebRoot/WEB-INF/lib目录下。

    我也没有挑选哪些是不需要的,最后用到的jar如下:

复制代码
antlr-2.7.7.jar com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.apache.commons.logging-1.1.1.jar com.springsource.org.aspectj.weaver-1.6.3.RELEASE.jar commons-lang3-3.1.jar dom4j-1.6.1.jar hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.6.Final.jar hibernate-entitymanager-4.1.6.Final.jar hibernate-jpa-2.0-api-1.0.1.Final.jar javassist-3.15.0-GA.jar jboss-logging-3.1.0.GA.jar jboss-transaction-api_1.1_spec-1.0.0.Final.jar log4j-1.2.17.jar mysql-connector-java-5.0.4-bin.jar org.springframework.aop-3.1.2.RELEASE.jar org.springframework.asm-3.1.2.RELEASE.jar org.springframework.aspects-3.1.2.RELEASE.jar org.springframework.beans-3.1.2.RELEASE.jar org.springframework.context-3.1.2.RELEASE.jar org.springframework.context.support-3.1.2.RELEASE.jar org.springframework.core-3.1.2.RELEASE.jar org.springframework.expression-3.1.2.RELEASE.jar org.springframework.instrument-3.1.2.RELEASE.jar org.springframework.instrument.tomcat-3.1.2.RELEASE.jar org.springframework.jdbc-3.1.2.RELEASE.jar org.springframework.jms-3.1.2.RELEASE.jar org.springframework.js.resources-2.3.0.RELEASE.jar org.springframework.orm-3.1.2.RELEASE.jar org.springframework.oxm-3.1.2.RELEASE.jar org.springframework.test-3.1.2.RELEASE.jar org.springframework.transaction-3.1.2.RELEASE.jar org.springframework.web-3.1.2.RELEASE.jar org.springframework.web.portlet-3.1.2.RELEASE.jar org.springframework.web.servlet-3.1.2.RELEASE.jar slf4j-api-1.6.6.jar slf4j-log4j12-1.6.6.jar spring-data-commons-core-1.3.0.M1.jar spring-data-jpa-1.0.2.RELEASE.jar
复制代码

  

  3、在MySql数据库中建立一个叫spring_data_jpa的数据库。

create database spring_data_jpa default character set utf8;

 

  4、JPA配置文件persistence.xml

    1)在src目录下建立一个叫META-INF的文件夹

    2)在META-INF文件夹下建立persistence.xml文件

      persistence.xml内容如下:

复制代码
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"              xsi:schemaLocation="http://java.sun.com/xml/ns/persistence              http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">                  <persistence-unit name="myJPA" transaction-type="RESOURCE_LOCAL">     <provider>org.hibernate.ejb.HibernatePersistence</provider>           <properties>             <!--配置Hibernate方言 -->             <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />             <!--配置数据库驱动 -->             <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />             <!--配置数据库用户名 -->             <property name="hibernate.connection.username" value="root" />             <!--配置数据库密码 -->             <property name="hibernate.connection.password" value="root" />             <!--配置数据库url -->             <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/spring_data_jpa?useUnicode=true&amp;characterEncoding=UTF-8" />             <!--设置外连接抓取树的最大深度 -->             <property name="hibernate.max_fetch_depth" value="3" />             <!--自动输出schema创建DDL语句 -->             <property name="hibernate.hbm2ddl.auto" value="update" />                 <property name="hibernate.show_sql" value="true" />             <property name="hibernate.format_sql" value="true" />             <property name="javax.persistence.validation.mode" value="none"/>         </properties>     </persistence-unit>              </persistence>
复制代码

  

  5、Spring配置文件applicationContext.xml

   在src目录下建立applicationContext.xml

   applicationContext.xml内容如下:

复制代码
<?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"       xmlns:aop="http://www.springframework.org/schema/aop"       xmlns:tx="http://www.springframework.org/schema/tx"       xmlns:p="http://www.springframework.org/schema/p"       xmlns:cache="http://www.springframework.org/schema/cache"       xmlns:jpa="http://www.springframework.org/schema/data/jpa"          xsi:schemaLocation="http://www.springframework.org/schema/beans              http://www.springframework.org/schema/beans/spring-beans-3.1.xsd              http://www.springframework.org/schema/context              http://www.springframework.org/schema/context/spring-context-3.1.xsd              http://www.springframework.org/schema/aop              http://www.springframework.org/schema/aop/spring-aop-3.1.xsd              http://www.springframework.org/schema/tx               http://www.springframework.org/schema/tx/spring-tx-3.1.xsd           http://www.springframework.org/schema/cache            http://www.springframework.org/schema/cache/spring-cache-3.1.xsd           http://www.springframework.org/schema/data/jpa           http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">                    <context:annotation-config />                    <context:component-scan base-package="cn.luxh.app"/>                 <!-- 定义实体管理器工厂 -->         <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">                <property name="persistenceUnitName" value="myJPA"/>         </bean>                    <!-- 配置事务管理器 -->              <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">               <property name="entityManagerFactory" ref="entityManagerFactory" />              </bean>                    <!-- 启用 annotation事务-->             <tx:annotation-driven transaction-manager="transactionManager"/>                         <!-- 配置Spring Data JPA扫描目录-->             <jpa:repositories base-package="cn.luxh.app.repository"/>                   </beans>
复制代码

  

  6、web.xml

  web.xml内容如下:

复制代码
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5"      xmlns="http://java.sun.com/xml/ns/javaee"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee      http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">   <display-name></display-name>           <!-- log4j配置 -->   <context-param>     <param-name>webAppRootKey</param-name>     <param-value>springdatajpa.root</param-value>   </context-param>   <context-param>     <param-name>log4jConfigLocation</param-name>     <param-value>classpath:log4j.properties</param-value>   </context-param>   <listener>     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>   </listener>      <!-- 编码过滤器 -->   <filter>     <filter-name>characterEncodingFilter</filter-name>     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>     <init-param>           <param-name>encoding</param-name>           <param-value>UTF-8</param-value>     </init-param>             </filter>   <filter-mapping>     <filter-name>characterEncodingFilter</filter-name>     <url-pattern>/*</url-pattern>   </filter-mapping>      <!-- 配置spring监听器 -->   <context-param>     <param-name>contextConfigLocation</param-name>     <param-value>classpath:applicationContext.xml</param-value>   </context-param>   <listener>     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   </listener>      <!-- 配置缓存清除监听器,负责处理由 JavaBean Introspector 功能而引起的缓存泄露 -->   <listener>         <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>     </listener>       <welcome-file-list>     <welcome-file>index.jsp</welcome-file>   </welcome-file-list> </web-app>
复制代码

 

  7、日志配置

    在src目录下建立log4j.properties文件

    log4j.properties内容如下:

复制代码
log4j.rootLogger=INFO,CONSOLE,FILE log4j.addivity.org.apache=true  # 应用于控制台  log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender  log4j.appender.Threshold=INFO  log4j.appender.CONSOLE.Target=System.out  log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout  log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n  #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n  #应用于文件  log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.FILE.File=${springdatajpa.root}/springdatajpa.log  log4j.appender.FILE.Append=true  log4j.appender.FILE.layout=org.apache.log4j.PatternLayout  log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
复制代码

  

  8、所有环境配完毕,开始写一个Spring Data JPA 的增删改查

    1)建立相应的包

                                               

 

    2)领域模型实体类User

复制代码
package cn.luxh.app.domain;  import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table;  /**  * 用户信息  * @author Luxh  * 2012-8-30  */ @Entity @Table(name="t_user") public class User {          @Id     @GeneratedValue     private Integer id;          //账号     private String account;          //姓名     private String name;          //密码     private String password;               //省略 getter和setter方法  }
复制代码

    3)声明持久层接口UserRepository

    让UserRepository接口继承CrudRepository<T,ID>,T是领域实体,ID是领域实体的主键类型。CrudRepository实现了相应的增删改查方法。

复制代码
package cn.luxh.app.repository;   import org.springframework.data.repository.CrudRepository;  import cn.luxh.app.domain.User;  /**  * 用户持久层接口  * @author Luxh  * 2012-8-31  */ public interface UserRepository extends CrudRepository<User,Integer>{           }
复制代码

    不再需要持久层接口实现类。

 

    4)业务层

      一般多层架构是控制层调用业务层,业务层再调用持久层。所以这里写个业务层。

      a、业务层接口:

复制代码
package cn.luxh.app.service;  import cn.luxh.app.domain.User;  /**  * 用户业务接口  * @author Luxh  * 2012-8-31  */ public interface UserService {          /**      * 保存用户      * @param user      */     void saveUser(User user);          /**      * 根据id查找用户      * @param id      * @return      */     User findUserById(Integer id);          /**      * 更新用户      * @param user      */     void updateUser(User user);          /**      * 根据ID删除用户      * @param id      */     void deleteUserById(Integer id);           }
复制代码

    b、业务层接口实现类

复制代码
package cn.luxh.app.service;  import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;  import cn.luxh.app.domain.User; import cn.luxh.app.repository.UserRepository;  /**  * 用户业务服务实现类  * @author Luxh  * 2012-8-31  */ @Service("userService") public class UserServiceImpl implements UserService{               @Autowired     private UserRepository userRepository;//注入UserRepository      @Override     @Transactional     public void saveUser(User user) {         userRepository.save(user);              }      @Override     @Transactional(readOnly=true)     public User findUserById(Integer id) {         return userRepository.findOne(id);     }           @Override     @Transactional     public void updateUser(User user) {         userRepository.save(user);     }      @Override     @Transactional     public void deleteUserById(Integer id) {         userRepository.delete(id);     }  }
复制代码

 

  9)编写测试用例

    在执行测试的时候,发现如下错误:

复制代码
Caused by: java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;     at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:633)     at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)     at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:268)     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)     ... 51 more
复制代码

  网上说是新版本的Hibernate跟javaee.jar里面的JPA接口冲突了。

  解决方法:移除MyEclipse自带的Java EE 5 Libraries,自己新建一个user libraries,加入Java EE中的jsf-api.jar、jsf-impl.jar和jstl-1.2.jar,再加入Tomcat中自带的     servlet-api.jar

                    

        

       

       

       

 

  用servlet-api.jar替换掉javaee.jar就没问题了。

  测试代码:

复制代码
package cn.luxh.app.test;  import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  import cn.luxh.app.domain.User; import cn.luxh.app.service.UserService;  @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"/applicationContext.xml"})  public class UserTest {          @Autowired     private UserService userService;          //保存用户     @Test     public void testSaveUser() {         User user = new User();         user.setAccount("LiHuai");         user.setName("李坏");         user.setPassword("123456");                  userService.saveUser(user);     }               //根据id查找用户     @Test     public void testFindUserById() {         Integer id = 1;         User user = userService.findUserById(id);         Assert.assertEquals("李坏",user.getName());     }          //更新用户     @Test     public void testUpdateUser() {         Integer id = 1;         User user = userService.findUserById(id);         user.setName("李寻欢");                  userService.updateUser(user);              }          //根据id删除用户     @Test     public void testDeleteUserById() {         Integer id = 1;                  userService.deleteUserById(id);     }  }
复制代码

 


  

  使用Spring Data JPA相当的简单,我们只需要定义持久层的接口,不需要编写实现代码。

  步骤和注意点:

  1)在spring配置文件中添加仓库接口的扫描路径 <jpa:repositories base-package="cn.luxh.app.repository"/>

  2)编写领域实体,需要按照JPA规范

  3)编写仓库Repository<T,ID>接口,依靠Spring Data规范定义接口方法。

     比如按照规范定义一个数据访问接口方法  List<User> findByName(String name);

     Spring Data JPA 就会自动转化为 select u from User u where u.name = ?1

  


 

  可以使用的仓库接口有:
    Repository:           是 Spring Data的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法。

    CrudRepository:          继承Repository,提供增删改查方法,可以直接调用。

    PagingAndSortingRepository:    继承CrudRepository,具有分页查询和排序功能

    JpaRepository:                         继承PagingAndSortingRepository,针对JPA技术提供的接口

    JpaSpecificationExecutor:          可以执行原生SQL查询

  

 

  

 

 

 

 

      

 

 

    

 

 

 

 

 

    

  

转载于:https://www.cnblogs.com/daniell003/p/3529940.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转帖]好技术领导,差技术领导

团队合作一个优秀的技术领导必然是团队的一份子&#xff0c;他们认为当整个团队成功时自己才称得上成功。他们不仅要做好繁杂和不讨好的本职工作&#xff0c;还要清除项目中的障碍&#xff0c;从而让整个团队能够以100%的效率运转起来。一个好的技术领导会努力拓宽团队在技术上…

C#打开文件对话框和文件夹对话框

打开文件对话框OpenFileDialog OpenFileDialog ofd new OpenFileDialog();ofd.Filter "Excel文件(*.xls;*.xlsx)|*.xls;*.xlsx|所有文件|*.*";ofd.ValidateNames true;ofd.CheckPathExists true;ofd.CheckFileExists true;if (ofd.ShowDialog() DialogResult.O…

ZOJ 2112 Dynamic Rankings

这里是题目地址 其实就是带修改的区间第K大。 写了一下BIT套主席树&#xff0c;内存飞起&#xff0c;似乎需要特别的优化技巧 所以还是写了一下线段树套平衡树&#xff0c;跑了1s左右。 其实线段树套平衡树就是归并树的自然扩展而已。 归并树是把归并排序的过程建成一颗线段树…

python3[进阶]8.对象引用、可变性和垃圾回收

文章目录8.1变量不是盒子8.2 标识,相等性和别名8.2.1 在和is之间选择8.2.2 元组的相对不可变性8.3 默认做浅复制&#xff08;拓展&#xff09;为任意对象做深复制和浅复制深拷贝和浅拷贝有什么具体的区别呢&#xff1f;8.4 函数的参数作为引用时8.4.1 不要使用可变类型作为参数…

python (第八章)补充-可迭代对象(补充高阶函数,以及常用的高阶函数)

文章目录可迭代对象迭代器什么是迭代器什么是生成器生成器的作用生成器的注意事项总结&#xff1a;高阶函数什么是高阶函数&#xff1f;map()函数filter()函数reduce()函数参考可迭代对象 我们已经知道&#xff0c;可以直接作用于for循环的数据类型有以下几种&#xff1a; 一类…

网络阅读开篇

网络阅读也符合马太效应&#xff0c;投入的时间越多&#xff0c;获取的有效信息却越来越少&#xff0c;因此做出以下规定&#xff1a; 1、限制网络阅读时间&#xff1b; 2、每次阅读做总结。 本来想的挺简单的&#xff0c;随便搜了一下&#xff0c;居然一部小心拜读了两位大神的…

python (第二章)数据结构

文章目录2.5 对序列使用 和 建立由列表组成的列表2.6序列的增量赋值&#xff08;和&#xff09;关于 的谜题补充&#xff1a;extend()方法和有什么区别呢&#xff1f;2.7 list.sort方法和内置函数sorted(排序)2.8 用bisect来管理已排序的序列2.8.2用bisect.insort插入元素2.9 当…

[Windows Phone] 实作不同的地图显示模式

[Windows Phone] 实作不同的地图显示模式 原文:[Windows Phone] 实作不同的地图显示模式前言 本文章主要示范如何让地图有不同的模式产生&#xff0c;例如平面图、地形图、鸟瞰图、鸟瞰图含街道等。 这部分主要是调整 Map.CartographicMode 属性&#xff0c;其中 MapCartograph…

[STemWin教程入门篇]第一期:emWin介绍

特别说明&#xff1a;原创教程&#xff0c;未经许可禁止转载&#xff0c;教程采用回复可见的形式&#xff0c;谢谢大家的支持。 armfly-x2,x3,v2,v3,v5开发板裸机和带系统的emWin工程已经全部建立&#xff0c;链接如下&#xff1a; http://bbs.armfly.com/read.php?tid1830 SE…

python 栈【测试题】

文章目录1.删除最外层的括号信息要求答案2.棒球比赛信息示例答案3. 用栈实现队列要求说明:答案4.用队列模拟栈描述注意答案5.下一个更大的元素&#xff08;未解&#xff09;信息&#xff1a;示例&#xff1a;注意:答案&#xff1a;6.删除字符串中的所有相邻重复项信息示例&…

python进阶(第三章1) 字典

文章目录3.1 泛映射类型什么是可散列的数据类型&#xff08;键的要求&#xff09;字典的构造方法3.2 字典推导(dictcomp)3.3 常见的映射方法用setdefault处理找不到的键3.4 映射的弹性键查询3.4.1 defaultdict:处理找不到的键的一个选择注意&#xff1a;defaultdict与dict实例化…

python基础 list和tuple

文章目录一、list1、len()函数可以获得list元素的个数2、索引从0开始3、末尾追加 append(xx)4、也可以把元素插入到指定的位置&#xff0c;比如索引号为1的位置(insert)5、末尾删除pop() &#xff0c;并且返回该值6、要删除指定位置的元素&#xff0c;用pop(i)方法&#xff0c;…

python基础 dict和set

文章目录dictset4.用集合为列表去重5.集合的增 add,update6.集合的删 discard,remove,pop,clear7 集合运算7.1 子集(<或者issubset()方法)7.2并集(|或者union()方法)7.3 交集(&或者intersection())7.4 差集(-或者difference()方法)7.5 对称集(^或者symmetric_difference…

python进阶(第三章2)字典和集合

文章目录3.8 集合论nee中的元素在haystack中出现的次数&#xff0c;可以在任何可迭代对象上3.8.1集合字面量3.8.2 集合推导3.8.3 集合操作3.9 dict和set的背后3.9.1 一个关于效率的实验3.9.2 字典中的散列表1.散列值和相等性2.散列表算法获取值&#xff1a;添加新的元素更新现有…

Android下实现GPS定位服务

1.申请Google API Key&#xff0c;参考前面文章 2.实现GPS的功能需要使用模拟器进行经纬度的模拟设置&#xff0c;请参考前一篇文章进行设置 3.创建一个Build Target为Google APIs的项目 4.修改Androidmanifest文件&#xff1a; view plain<uses-library android:name"…

DEDECMS全版本gotopage变量XSS ROOTKIT 0DAY

影响版本&#xff1a; DEDECMS全版本 漏洞描叙&#xff1a; DEDECMS后台登陆模板中的gotopage变量未效验传入数据&#xff0c;导致XSS漏洞。 \dede\templets\login.htm 65行左右 <input type"hidden" name"gotopage" value"<?php if(!empty($g…

Android开源库loopj的android-async-http的 JsonHttpResponseHandler 存在死循环GC_CONCURRENT

我现在用的是 AndroidAsyncHttp 1.4.4 版本&#xff0c;之前遇到一个很奇怪的问题&#xff0c; 当使用 JsonHttpResponseHandler 解析请求的页面出现服务器错误或其他情况返回的内容不是 JSON 字符串时不会调用自己复写实现的 onSuccess 或者 onFailure 方法&#xff0c;将会出…

进程状态转换(了解)

进程三个基本状态&#xff1a;就绪、阻塞、运行 这个比较简单&#xff0c;进程创建后进入就绪状态、然后若CPU空闲或能打断CPU正在执行的进程&#xff08;优先级低的&#xff09;&#xff0c;那么就绪状态转换成运行态&#xff0c;运行时&#xff0c;进程需要用到其他资源&…

2014阿里巴巴校园招聘笔试题 - 中南站

转载于:https://www.cnblogs.com/gotodsp/articles/3530329.html

Spring的IOC原理[通俗解释一下]

1. IoC理论的背景 我们都知道&#xff0c;在采用面向对象方法设计的软件系统中&#xff0c;它的底层实现都是由N个对象组成的&#xff0c;所有的对象通过彼此的合作&#xff0c;最终实现系统的业务逻辑。 图1&#xff1a;软件系统中耦合的对象 如果我们打开机械式手表的后盖&am…