天天看点

关于IOC与DI的学习心得

一.IOC的概念

对于IOC通俗易懂来说,就是对一个控制对象进行创建,主要为了降低耦合度,提高代码的复用性,在开发中有两种方法可以来实现IOC的控制反转。
(一)在applicationContext.xml中进行对象的声明与创建
           
<bean id="userServiceId" class="spring_1.UserServiceImpl"></bean>
	<bean id="bookDaoId" class="spring_1.BookDaoImpl"></bean>
           
此代码便是对于两个对象创建的声明,其中id是对于他声明的代名词,class中代表的便是他的实现类。
此时便可以通过通过以下代码随意调用其中一个实现类中的任意方法
           
public class TestIoC {
    @Test
    public void demo1(){
//        //从spring容器获得
//        //1获得容器
//        String xmlPath="spring_1/applicationContext.xml";
//        ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
//        //2获得内容---不需要自己new,都是从sping容器获得
//        spring_ioc_UserService userService=(UserServiceImpl)applicationContext.getBean("userServiceId");
//        userService.addUser();


        String xmlpath="spring_1/beans.xml";
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlpath);

        di_BookService di_bookService=(di_BookService) applicationContext.getBean("bookServiceId");
        di_bookService.addBook();
    }
}

           

此时所显示的便是把控制权交给了外部容器。

(二)但在日常开发中常常会使用基于注解的形式开发并代替在applicationContext.xml对于对象的声明。

@Component(“id”)

在你所创建的对象上方加入这行代码便会等效上面所配置的实现声明与创建。

而在WEB开发中,常常会有对相应模块的声明,使其更明显的代表所对应的模块发开,但注意的是需要在applicationContext.xml中进行扫描,并进行命名空间文件的添加来实现这种功能。

@Repository:便是对dao层里面的创建对象功能进行声明。

@Controller:便是对web开发层里面创建的对象进行声明。

@Service:便是对service逻辑处理层里面创建对象进行声明。

二.DI的概念

DI简单来说就是对于依赖的注入,简单来说就是在另一个对象中,通过对其进行依赖注入可达到调用注入实体的方法。
其中有两种方式进行注入------------------>1.基于xml完成依赖注入。2.基于注解完成依赖注入
(一)基于xml完成依赖注入
           
<bean id="bookServiceId" class="spring_1.di_BookServiceImpl">
		<property name="bookDao" ref="bookDaoId"></property>
	</bean>

           

此时便形成了最简单的注入,但并不能实现完整的依赖注入,还需要在所需注入的实现类中加入以下私有 静态变量和setter方法进行完备或者直接接口=实现类的方式。

方式一:之前,接口=实现类
    private spring_di_BookDao bookDao=new BookDaoImpl();
 方式二:接口+setter方法
    private spring_di_BookDao bookDao;

    public void setBookDao(spring_di_BookDao bookDao) {
        this.bookDao = bookDao;
    }

           

此时便可以直接在实现类中调用其BookDao实现类中的方法,当进行测试时,当你调用目标实现类的时候便可以直接调用目标类中的依赖注入。

(二)基于注解方式的注入

这种方式的最大优点就是省去了在xml的配置的,但注意的是需要在applicationContext.xml中进行扫描,并进行命名空间文件的添加来实现这种功能。

而依赖注入的有三种方式进行注入

当目标为普通值:@Value(" ")

当目标为y引用值:1.按照类型注入@Autowired

2.按照名称注入@[email protected](“名称”)

3.按照名称注入@Resource(“名称”)

三.对于IOC和DI注入的扩展

(一)对于IOC实例bean共有三种方式:默认构造,静态工厂,实例工厂

默认构造的方式

可以在applicationContext.xml文件中添加如下代码直接添加即可

<bean id="userId" class="spring_4.User">
		<constructor-arg type="java.lang.String" value="jack"></constructor-arg>
		<constructor-arg type="java.lang.Integer" value="18"></constructor-arg>
	</bean>
           

静态工厂

在目标实现类中可以创建一个静态方法

//    public static spring_ioc_UserService CreateService(){
//        return new UserServiceImpl();
//    }
           

并在applicationContext.xml中进行声明

实例工厂(和静态工厂的实现方法大同小异)

但注意的是在实现类中声明方法的时候不需要加static,而在applicationContext.xml中需要加入新bean

<!--创建工厂实例-->
	<bean id="myBeanFactory" class="spring_2.装配Bean_基于XML_day1"></bean>
	<!--获得userService-->
	<bean id="userServiceId" factory-bean="myBeanFactory" factory-method="CreateService"></bean>
           

此时便可以通过直接调用方法实现实例的创建

<!--创建工厂实例-->
	<bean id="myBeanFactory" class="spring_2.装配Bean_基于XML_day1"></bean>
	<!--获得userService-->
	<bean id="userServiceId" factory-bean="myBeanFactory" factory-method="CreateService"></bean>
           

(二)对于注入还可以是

数组:

<array>

List:

<list>

Set:

<set>

Map:

<map>

Properties:

<props>

直接可以通过在applicationContext.xml文件中实现集合注入

<bean id="CollDataid" class="spring_4.集合注入.CollData">
		<property name="arrayData">
			<array><value></value></array>
		</property>
		<property name="mapData">
			<map>
				<entry>
					<key></key>
					<value></value>
				</entry>
			</map>
		</property>
		<property name="props">
			<props>
				<prop key=""></prop>
			</props>
		</property>
	</bean>
           

以上便是部分注入的代码示例。

继续阅读