Spring基础知识之IOC容器

什么事IOC?

  控制反转(Inversion of Control,缩写为IoC),是向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度,其中最常见的方式是“依赖注入”(Dependency Injection,简称DI),还有一种方式叫做“依赖查找(Dependency LookUp)”

控制反转(IOC)和依赖注入(DI)的关系?

  控制反转(IOC)是想要实现的目标或者效果,而依赖注入(DI)则是实现这种效果的方式。

Spring实现IOC的思路和方法?

  Spring实现IOC的思路是提供一些配置信息用来描述类之间的依赖关系,然后由容器去解析这些配置信息,继而维护好对象之间的依赖关系,前提是对象之间的依赖关系必须在类中定义好,比如A.class中有一个B.class的属性,那么我们可以理解为A依赖了B。

  Spring实现IOC的思路大概可以拆分成3点:

    1.应用程序中提供类,提供依赖关系(属性或者构造方法)

    2.把需要交给容器管理的对象通过配置信息告诉容器(xml,annotation,javaconfig)

    3.把各个类之间的依赖关系通过配置信息告诉容器

  配置这些信息的方法有三种,分别是xml,annotation,javaconfig

  维护的过程为自动注入,自动注入的方法有两种,构造方法(<constructor-arg>标签) 和 setter(<property>标签);

    使用构造方法注入<constructor-arg>标签:  

 1 /**
 2  * Service接口实现类
 3  * @author Administrator
 4  *
 5  */
 6 public class IndexServiceImpl implements IndexService {
 7 
 8     //引入IndexDao对象
 9     private IndexDao dao;
10     //创建构造函数
11     public IndexServiceImpl(IndexDao dao){
12         this.dao = dao;
13     }
14     //方法
15     public void ServiceTest() {
16         dao.test();
17     }
18 }

     使用setter方法注入(<property>标签):

 1 /**
 2  * Service接口实现类
 3  * @author Administrator
 4  *
 5  */
 6 public class IndexServiceImpl implements IndexService {
 7 
 8     //引入IndexDao对象
 9     private IndexDao dao;
10     public void ServiceTest() {
11         dao.test();
12     }
13     /**
14      * 通过set方法注入spring容器
15      */
16     public void setDao(IndexDao dao) {
17         this.dao = dao;
18     }
19 }

     使用P标签注入属性(简写的property标签):

     使用C标签注入属性(简写的constructor标签)

     使用注解功能进行依赖注入:

      @Component与@Controller(Action层),@Service(Service层),@Repository(Dao层)的区别:

        @Component是其他三种的基类。

     使用@Service注解

 1 /**
 2  * Service接口实现类
 3  * @author Administrator
 4  *
 5  */
 6 @Service("service")
 7 public class IndexServiceImpl implements IndexService {
 8 
 9     //使用注解方式引入IndexDao对象
10     @Autowired
11     private IndexDao dao;
12     //创建构造函数
13     public IndexServiceImpl(IndexDao dao){
14         this.dao = dao;
15     }
16     //方法
17     public void ServiceTest() {
18         dao.test();
19     }
20 }

  使用@Component注解:

 1 /**
 2  * Dao实现类
 3  * @author Administrator
 4  *
 5  */
 6 @Component
 7 public class IndexDaoImpl implements IndexDao {
 8 
 9     public void test() {
10         System.out.println("Dao测试方法");
11     }
12 
13 }

  使用Java-config方式进行依赖注入:

    创建Java配置类:

 1 /**
 2  * 使用Java-config配置
 3  * @author Administrator
 4  *
 5  */
 6 @Configuration
 7 @ComponentScan("org.wk.spring")
 8 public class SpringAnnotation {
 9 
10 }

    测试类:

 1 /**
 2  * Java配置测试类
 3  * @author Administrator
 4  *
 5  */
 6 public class Test1 {
 7 
 8     public static void main(String[] args) {
 9         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringAnnotation.class);
10         IndexService service =(IndexService) context.getBean("service");
11         service.ServiceTest();
12     }
13 
14 }

    使用ImportResource注解导入xml配置文件:

 1 /**
 2  * 使用Java-config配置
 3  * @author Administrator
 4  *
 5  */
 6 @Configuration
 7 @ComponentScan("org.wk.spring")
 8 @ImportResource("classpath:spring.xml")
 9 public class SpringAnnotation {
10 
11 }

Spring的自动装配:

  在描述类之间的依赖关系的时候,如果使用spring的自动装配功能,那么我们可以省去很多配置,并且如果对象的依赖发生更新后,我们有不需要去重新配置。

  自动装配的方法:

    1.no:不使用自动装配,也是默认的default

    2.byType:通过需要装配的属性对应的类,去配置文件中遍历寻找具有相同类的配置,然后进行装配,所有这就要求同一个类在配置文件中只能装配一次。

    3.byName:通过需要装配的属性,在set方法时,spring通过解析set方法(将set方法名截取)来与配置文件中的注册类匹配。

    4.constructor:通过构造器来进行自动装配,通过构造器中的参数进行装配。

@Autowired和@Resource的区别:

  @Autowired:默认使用byType的方式进行装配,如果byType找不到就是用byName,使用byName也找不到就报错。

  @Resource:默认使用byName的方式进行装配,但是是根据属性名进行,不是根据set方法的截取进行的。但是@Resource有一个type属性,可以指定对应的类(@Resource(type=Aa.class))

猜你喜欢

转载自www.cnblogs.com/wk-missQ1/p/12398747.html