控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中我们使用面向对象编程对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获取依赖对象的方式反转了。

IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象。

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

一、使用XML配置的方式实现IOC

假设项目中需要完成对图书的数据访问服务,我们定义好了IBookDAO接口与BookDAO实现类

IBookDAO接口如下:

  1. package com.zhangguo.Spring051.ioc01;
  2.  
  3. /**
  4. * 图书数据访问接口
  5. */
  6. public interface IBookDAO {
  7. /**
  8. * 添加图书
  9. */
  10. public String addBook(String bookname);
  11. }

BookDAO实现类如下:

  1. package com.zhangguo.Spring051.ioc01;
  2.  
  3. /**
  4. * 图书数据访问实现类
  5. */
  6. public class BookDAO implements IBookDAO {
  7.  
  8. public String addBook(String bookname) {
  9. return "添加图书"+bookname+"成功!";
  10. }
  11. }

Maven项目的pom.xml如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4.  
  5. <groupId>com.zhangguo</groupId>
  6. <artifactId>Spring051</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9.  
  10. <name>Spring051</name>
  11. <url>http://maven.apache.org</url>
  12.  
  13. <properties>
  14. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15. <spring.version>4.3.0.RELEASE</spring.version>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>junit</groupId>
  20. <artifactId>junit</artifactId>
  21. <scope>test</scope>
  22. <version>4.10</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework</groupId>
  26. <artifactId>spring-context</artifactId>
  27. <version>${spring.version}</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.aspectj</groupId>
  31. <artifactId>aspectjweaver</artifactId>
  32. <version>1.8.9</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>cglib</groupId>
  36. <artifactId>cglib</artifactId>
  37. <version>3.2.4</version>
  38. </dependency>
  39. </dependencies>
  40. </project>

业务类BookService如下:

  1. package com.zhangguo.Spring051.ioc01;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. /**
  7. * 图书业务类
  8. */
  9. public class BookService {
  10. IBookDAO bookDAO;
  11.  
  12. public BookService() {
  13. //容器
  14. ApplicationContext ctx=new ClassPathXmlApplicationContext("IOCBeans01.xml");
  15. //从容器中获得id为bookdao的bean
  16. bookDAO=(IBookDAO)ctx.getBean("bookdao");
  17. }
  18.  
  19. public void storeBook(String bookname){
  20. System.out.println("图书上货");
  21. String result=bookDAO.addBook(bookname);
  22. System.out.println(result);
  23. }
  24. }

容器的配置文件IOCBeans01.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:p="http://www.springframework.org/schema/p"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd">
  7. <bean id="bookdao" class="com.zhangguo.Spring051.ioc01.BookDAO"></bean>
  8. </beans>

测试类Test如下:

  1. package com.zhangguo.Spring051.ioc01;
  2.  
  3. public class Test {
  4. @org.junit.Test
  5. public void testStoreBook()
  6. {
  7. BookService bookservice=new BookService();
  8. bookservice.storeBook("《Spring MVC权威指南 第一版》");
  9. }
  10. }

运行结果:

 

二、使用Spring注解配置IOC

上一个示例是使用传统的xml配置完成IOC的,如果内容比较多则配置需花费很多时间,通过注解可以减轻工作量,但注解后修改要麻烦一些,偶合度会增加,应该根据需要选择合适的方法。

2.1、修改BookDAO

  1. package com.zhangguo.Spring051.ioc02;
  2.  
  3. import org.springframework.stereotype.Component;
  4. import org.springframework.stereotype.Repository;
  5.  
  6. /**
  7. * 图书数据访问实现类
  8. */
  9. @Component("bookdaoObj")
  10. public class BookDAO implements IBookDAO {
  11.  
  12. public String addBook(String bookname) {
  13. return "添加图书"+bookname+"成功!";
  14. }
  15. }

在类上增加了一个注解Component,在类的开头使用了@Component注解,它可以被Spring容器识别,启动Spring后,会自动把它转成容器管理的Bean。

除了@Component外,Spring提供了3个功能基本和@Component等效的注解,分别对应于用于对DAO,Service,和Controller进行注解。
1:@Repository 用于对DAO实现类进行注解。
2:@Service 用于对业务层注解,但是目前该功能与 @Component 相同。
3:@Constroller用于对控制层注解,但是目前该功能与 @Component 相同。

2.2、修改BookService

  1. package com.zhangguo.Spring051.ioc02;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.stereotype.Service;
  7.  
  8. /**
  9. * 图书业务类
  10. */
  11. @Component
  12. public class BookService {
  13. IBookDAO bookDAO;
  14.  
  15. public void storeBook(String bookname){
  16. //容器
  17. ApplicationContext ctx=new ClassPathXmlApplicationContext("IOCBeans02.xml");
  18. //从容器中获得id为bookdao的bean
  19. bookDAO=(IBookDAO)ctx.getBean("bookdaoObj");
  20. System.out.println("图书上货");
  21. String result=bookDAO.addBook(bookname);
  22. System.out.println(result);
  23. }
  24. }

将构造方法中的代码直接写在了storeBook方法中,避免循环加载的问题。

2.3、修改IOC配置文件IOCBeans02.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:p="http://www.springframework.org/schema/p"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context-4.3.xsd">
  10. <context:component-scan base-package="com.zhangguo.Spring051.ioc02"></context:component-scan>
  11. </beans>

粗体字是新增的xml命名空间与模式约束文件位置。增加了注解扫描的范围,指定了一个包,可以通过属性设置更加精确的范围如:

<context>标记常用属性配置:
resource-pattern:对指定的基包下面的子包进行选取
<context>子标记:
include-filter:指定需要包含的包
exclude-filter:指定需要排除的包
<!-- 自动扫描com.zhangguo.anno.bo中的类进行扫描 --> 
<context:component-scan base-package="com.zhangguo.anno" resource-pattern="bo/*.class" />

<context:component-scan base-package="com.zhangguo.anno" >

<context:include-filter type="aspectj“ expression="com.zhangguo.anno.dao.*.*"/>
  <context:exclude-filter type=“aspectj” expression=“com.zhangguo.anno.entity.*.*”/>

</context:component-scan>

include-filter表示需要包含的目标类型,exclude-filter表示需要排除的目标类型,type表示采的过滤类型,共有如下5种类型:

Filter Type Examples Expression Description
annotation org.example.SomeAnnotation 注解了SomeAnnotation的类
assignable org.example.SomeClass 所有扩展或者实现SomeClass的类
aspectj org.example..*Service+ AspectJ语法表示org.example包下所有包含Service的类及其子类
regex org\.example\.Default.* Regelar Expression,正则表达式
custom org.example.MyTypeFilter 通过代码过滤,实现org.springframework.core.type.TypeFilter接口

expression表示过滤的表达式。

  1. <!-- 1、如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类 -->
  2. <context:component-scan base-package="com.zhangguo.Spring051"
  3. resource-pattern="ioc04/A*.class">
  4. </context:component-scan>

只扫描com.zhangguo.Spring051.ioc04下所有名称以A开始的类。

  1. <!--2、扫描注解了org.springframework.stereotype.Repository的类
  2. exclude-filter表示排除,include-filter表示包含,可以有多个-->
  3. <context:component-scan base-package="com.zhangguo.Spring051.ioc04">
  4. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" />
  5. <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
  6. </context:component-scan>
  1. <!--3、aspectj类型,扫描dao下所有的类,排除entity下所有的类-->
  2. <context:component-scan base-package="com.zhangguo.anno" >
  3. <context:include-filter type="aspectj" expression="com.zhangguo.anno.dao.*.*"/>
  4. <context:exclude-filter type="aspectj" expression="com.zhangguo.anno.entity.*.*"/>
  5. </context:component-scan>

2.4、测试类

  1. package com.zhangguo.Spring051.ioc02;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. public class Test {
  7. @org.junit.Test
  8. public void testStoreBook()
  9. {
  10. //容器
  11. ApplicationContext ctx=new ClassPathXmlApplicationContext("IOCBeans02.xml");
  12. BookService bookservice=ctx.getBean(BookService.class);
  13. bookservice.storeBook("《Spring MVC权威指南 第二版》");
  14. }
  15. }

运行结果:

2.5、小结

从配置文件中我们可以看出我们并没有声明bookdaoObj与BookService类型的对象,但还是从容器中获得了实例并成功运行了,原因是:在类的开头使用了@Component注解,它可以被Spring容器识别,启动Spring后,会自动把它转成容器管理的Bean。

 

三、自动装配

从上一个示例中可以看出有两个位置都使用了ApplicationContext初始化容器后获得需要的Bean,可以通过自动装配简化。

3.1、修改BookDAO

  1. package com.zhangguo.Spring051.ioc03;
  2.  
  3. import org.springframework.stereotype.Component;
  4. import org.springframework.stereotype.Repository;
  5.  
  6. /**
  7. * 图书数据访问实现类
  8. */
  9. @Repository
  10. public class BookDAO implements IBookDAO {
  11.  
  12. public String addBook(String bookname) {
  13. return "添加图书"+bookname+"成功!";
  14. }
  15. }

把注解修改成了Repository,比Component更贴切一些,非必要。

3.2、修改BookService

  1. package com.zhangguo.Spring051.ioc03;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6. import org.springframework.stereotype.Service;
  7.  
  8. /**
  9. * 图书业务类
  10. */
  11. @Service
  12. public class BookService {
  13. @Autowired
  14. IBookDAO bookDAO;
  15.  
  16. public void storeBook(String bookname){
  17. System.out.println("图书上货");
  18. String result=bookDAO.addBook(bookname);
  19. System.out.println(result);
  20. }
  21. }

将类BookService上的注解替换成了Service;在bookDao成员变量上增加了一个注解@Autowired,该注解的作用是:可以对成员变量、方法和构造函数进行注解,来完成自动装配的工作,通俗来说就是会根据类型从容器中自动查到到一个Bean给bookDAO字段。@Autowired是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Qualifier。另外可以使用其它注解,@ Resource :等同于@Qualifier,@Inject:等同于@ Autowired。

@Service用于注解业务层组件(我们通常定义的service层就用这个)

@Controller用于注解控制层组件(如struts中的action)

@Repository用于注解数据访问组件,即DAO组件

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行注解。

装配注解主要有:@Autowired、@Qualifier、@Resource,它们的特点是:

1、@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;

2、@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;

3、@Resource注解是又J2EE提供,而@Autowired是由spring提供,故减少系统对spring的依赖建议使用@Resource的方式;如果Maven项目是1.5的JRE则需换成更高版本的。

4、@Resource和@Autowired都可以书写注解在字段或者该字段的setter方法之上

5、@Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的注解对象是成员变量、方法入参、构造函数入参。

6、@Qualifier("XXX") 中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。

7、@Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个,通过属性required可以设置非必要。

8、@Resource装配顺序
  8.1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  8.2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  8.3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  8.4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

  1. package com.zhangguo.Spring051.ioc05;
  2.  
  3. import javax.annotation.Resource;
  4.  
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.beans.factory.annotation.Qualifier;
  7. import org.springframework.context.ApplicationContext;
  8. import org.springframework.context.support.ClassPathXmlApplicationContext;
  9. import org.springframework.stereotype.Service;
  10.  
  11. /**
  12. * 图书业务类
  13. */
  14. @Service
  15. public class BookService {
  16.  
  17. public IBookDAO getDaoofbook() {
  18. return daoofbook;
  19. }
  20.  
  21. /*
  22. @Autowired
  23. @Qualifier("bookdao02")
  24. public void setDaoofbook(IBookDAO daoofbook) {
  25. this.daoofbook = daoofbook;
  26. }*/
  27.  
  28. @Resource(name="bookdao02")
  29. public void setDaoofbook(IBookDAO daoofbook) {
  30. this.daoofbook = daoofbook;
  31. }
  32.  
  33. /*
  34. @Autowired
  35. @Qualifier("bookdao02")
  36. */
  37. IBookDAO daoofbook;
  38.  
  39. /*
  40. public BookService(@Qualifier("bookdao02") IBookDAO daoofbook) {
  41. this.daoofbook=daoofbook;
  42. }*/
  43.  
  44. public void storeBook(String bookname){
  45. System.out.println("图书上货");
  46. String result=daoofbook.addBook(bookname);
  47. System.out.println(result);
  48. }
  49. }

3.3、测试运行

  1. package com.zhangguo.Spring051.ioc03;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. public class Test {
  7. @org.junit.Test
  8. public void testStoreBook()
  9. {
  10. //容器
  11. ApplicationContext ctx=new ClassPathXmlApplicationContext("IOCBeans03.xml");
  12. BookService bookservice=ctx.getBean(BookService.class);
  13. bookservice.storeBook("《Spring MVC权威指南 第三版》");
  14. }
  15. }

运行结果:

四、零配置实现IOC

所谓的零配置就是不再使用xml文件来初始化容器,使用一个类型来替代,

IBookDAO代码如下:

  1. package com.zhangguo.Spring051.ioc06;
  2.  
  3. /**
  4. * 图书数据访问接口
  5. */
  6. public interface IBookDAO {
  7. /**
  8. * 添加图书
  9. */
  10. public String addBook(String bookname);
  11. }

IBookDAO的实现类BookDAO代码如下:

  1. package com.zhangguo.Spring051.ioc06;
  2.  
  3. import org.springframework.stereotype.Component;
  4. import org.springframework.stereotype.Repository;
  5.  
  6. /**
  7. * 图书数据访问实现类
  8. */
  9. @Repository
  10. public class BookDAO implements IBookDAO {
  11.  
  12. public String addBook(String bookname) {
  13. return "添加图书"+bookname+"成功!";
  14. }
  15. }

在BookDAO类上注解了@Repository当初始化时该类将被容器管理会生成一个Bean,可以通过构造方法测试。

业务层BookService代码如下:

  1. package com.zhangguo.Spring051.ioc06;
  2.  
  3. import javax.annotation.Resource;
  4.  
  5. import org.springframework.stereotype.Service;
  6.  
  7. /**
  8. * 图书业务类
  9. */
  10. @Service
  11. public class BookService {
  12. @Resource
  13. IBookDAO bookDAO;
  14.  
  15. public void storeBook(String bookname){
  16. System.out.println("图书上货");
  17. String result=bookDAO.addBook(bookname);
  18. System.out.println(result);
  19. }
  20. }

类BookService将对容器管理因为注解了@Service,初始化时会生成一个单例的Bean,类型为BookService。在字段bookDAO上注解了@Resource,用于自动装配,Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。

新增一个用于替代原xml配置文件的ApplicationCfg类,代码如下:

  1. package com.zhangguo.Spring051.ioc06;
  2.  
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.ComponentScan;
  5. import org.springframework.context.annotation.Configuration;
  6.  
  7. /**
  8. * 容器的配置类
  9. */
  10. @Configuration
  11. @ComponentScan(basePackages="com.zhangguo.Spring051.ioc06")
  12. public class ApplicationCfg {
  13. @Bean
  14. public User getUser(){
  15. return new User("成功");
  16. }
  17. }

@Configuration相当于配置文件中的<beans/>,ComponentScan相当于配置文件中的context:component-scan,属性也一样设置

,@Bean相当于<bean/>,只能注解在方法和注解上,一般在方法上使用,源码中描述:@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}),方法名相当于id。中间使用到了User,User类的代码如下:

  1. package com.zhangguo.Spring051.ioc06;
  2.  
  3. import org.springframework.stereotype.Component;
  4.  
  5. @Component("user1")
  6. public class User {
  7. public User() {
  8. System.out.println("创建User对象");
  9. }
  10. public User(String msg) {
  11. System.out.println("创建User对象"+msg);
  12. }
  13. public void show(){
  14. System.out.println("一个学生对象!");
  15. }
  16. }

初始化容器的代码与以前有一些不一样,具体如下:

  1. package com.zhangguo.Spring051.ioc06;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  5.  
  6. public class Test {
  7. @org.junit.Test
  8. public void testStoreBook()
  9. {
  10. //容器,注解配置应用程序容器,Spring通过反射ApplicationCfg.class初始化容器
  11. ApplicationContext ctx=new AnnotationConfigApplicationContext(ApplicationCfg.class);
  12. BookService bookservice=ctx.getBean(BookService.class);
  13. bookservice.storeBook("《Spring MVC权威指南 第四版》");
  14. User user1=ctx.getBean("user1",User.class);
  15. user1.show();
  16. User getUser=ctx.getBean("getUser",User.class);
  17. getUser.show();
  18. }
  19. }

容器的初始化通过一个类型完成,Spring通过反射ApplicationCfg.class初始化容器,中间user1与getUser是否为相同的Bean呢?

答案是否定的,因为在ApplicationCfg中声明的方法getUser当相于在xml文件中定义了一个<bean id="getUser" class="..."/>,在User类上注解@Component("user1")相当于另一个<bean id="user1" class="..."/>。

运行结果:

小结:使用零配置和注解虽然方便,不需要编写麻烦的xml文件,但并非为了取代xml,应该根据实例需要选择,或二者结合使用,毕竟使用一个类作为容器的配置信息是硬编码的,不好在发布后修改。

 

五、示例下载

点击下载

(转)Spring实现IoC的多种方式的更多相关文章

  1. Spring实现Ioc的多种方式--控制反转、依赖注入、xml配置的方式实现IoC、对象作用域

    Spring实现Ioc的多种方式 一.IoC基础 1.1.概念: 1.IoC 控制反转(Inversion of Control) IoC是一种设计思想. 2.DI 依赖注入 依赖注入是实现IoC的一 ...

  2. Spring学习总结(一)——Spring实现IoC的多种方式

    控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...

  3. Spring实现IoC的多种方式

    目录 一.使用XML配置的方式实现IOC 二.使用Spring注解配置IOC 三.自动装配 四.零配置实现IOC 五.示例下载 控制反转IoC(Inversion of Control),是一种设计思 ...

  4. 七 Spring的IOC的注解方式

    Spring的IOC的注解方式入门 引入注解约束,配置组件扫描 类上的注解: @Conponent  @Controller @Service @Repository 普通属性的注解   @value ...

  5. Spring学习总结(三)——Spring实现AOP的多种方式

    AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的横向多模块统一控制的一种技术.AOP是OOP的补充,是Spring框架中的一个 ...

  6. Spring实现AOP的多种方式

    转载自:https://www.cnblogs.com/best/p/5736422.html:加了一些自己的注释: AOP(Aspect Oriented Programming)面向切面编程,通过 ...

  7. 【核心核心】4.Spring【IOC】注解方式

    1.导入jar包 2.创建对应的类 public interface HelloService { public void sayHello(); } /** * @Component(value=& ...

  8. 1.Spring【IOC】XML方式

    1.下载开发包 http://repo.springsource.org/libs-release-local/org/springframework/spring 2.创建WEB工程,引入jar包 ...

  9. spring的IOC和AOP

     spring的IOC和AOP 1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是 ...

随机推荐

  1. C语言中如何计算时间差

    #include <time.h>   #include <stdio.h>   int main()   {       time_t start ,end ;        ...

  2. Linux chmod和chown更改文件目录的所属者命令的用法

    一.chown 命令 用途:更改文件的所有者或组.命令由单词change owner组合而成. 使用示例: 1,更改文件的所有者: chown jim program.c 文件 program.c 的 ...

  3. java虚拟机性能监控调优及原则

    摘抄 http://uule.iteye.com/blog/2114697 一.JVM内存模型及垃圾收集算法  1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...

  4. Eclipse cdt debug时‘Error while launching command: gdb.exe --version’

    1. 下载gdb,网上很多可以下载一个,解压放在mingw/bin下,由于该目录以在path制定,在CMD下,gdb -version会显示当前gdb版本信息. 2.按照该文档配置即可实现debug

  5. eclipse cdt运行c程序报错“launch failed,binary not found”

    1. 安装了eclipsecdt版 2. 采用mingw 编译第一个c程序,报错“launch failed,binary not found”.检查是mingw下的bin目录在环境变量里设置错了. ...

  6. SpringMVC实现多文件(批量)上传

    1.springMVC实现多文件上传需要的包如图2.webroot下的结构如图所示 3.java代码: package cn.lxc.controller; import java.io.File; ...

  7. Objective-c官方文档 怎么自定义类

    通过类别来给已经存在的类添加方法来实现自定义类 如果你需要添加一个方法给一个已经存在的类,也许能增加新的功能使你更容易来在我们的应用里处理一些事情.最简单的方法是用类别. 这个语法有点想类的接口描述但 ...

  8. 【.NetCore学习】ASP.NET Core EF Core2.0 DB First现有数据库自动生成实体Context

    主要参考微软官方文档 https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db Microsoft .NE ...

  9. Material Design系列第三篇——Using the Material Theme

    Using the Material Theme This lesson teaches you to Customize the Color Palette Customize the Status ...

  10. 【linux】 scrapy : Could not find a version that satisfies the requirement Twisted>=13.1.0 (from Scrapy) (from versions: )

    centos7 + python3 安装 scrapy 时候报错,错误信息如下: Could not find a version that satisfies the requirement Twi ...