Ioc的基本原理及其xml的实现方法

1、主要原理:

IoC(Inversion of Control=控制反转):IoC就是应用本身不依赖对象的创建和维护而是交给外部容器(这里为spring),
这要就把应用和对象之间解耦,控制权交给了外部容器。
即Don't call me ,I'll call you!所以IoC也称DI(依赖注入=dependency injection ),其对象的创建和维护依赖于外部容器。

2、spring的配置文件

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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
       
       <bean id="mydao" class="net.xinqushi.dao.Impl.UserDAOFileImpl"></bean>
    <!--这是dao层中的一个实现方法(可以改变实现方法)-->
                                                                             
    
       <bean id="service" class="net.xinqushi.service.Impl.UserServiceImpl">


       <property name="dao" ref="mydao"></property>
 <!--在这spring外部容器中创建service对象的时候一定要连dao也一起创建了 -->
<!--不然会报空指针错误,因为service和dao是有联系的(基于dao的)-->


       </bean>
</beans>

3、web.xml文件的代码

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Struts Blank</display-name>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

</web-app>

4、这里举一个例子来说明Spring Ioc 的xml文件的实现方法:

UserServiceImpl类中的代码:(UserService是UserDAO和Action联系的桥梁)
public class UserServiceImpl implements UserService {

UserDAO dao;///被动等待创建=Ioc = 依赖注入(DI) 
public UserDAO getDao() {
return dao;
}
public void setDao(UserDAO dao) {
this.dao = dao;
}
@Override
public void add(User user) {

   dao.save(user);
}


}


UserAction中的代码:
public class UserAction {
    private User user;
    private UserService service;//同样使用IoC(都没有主动的创建对象)
public User getUser() {
return user;
}


public void setUser(User user) {
this.user = user;
}
    public UserService getService() {
return service;
}


public void setService(UserService service) {
this.service = service;
}


///做一个保存数据或者更新数据的action,名字为add,转到main.jsp上
public String add()
{  
service.add(user);
return "main";
}
}

5、下面通过此例子来详细说明一下spring Ioc通过xml文件的实现过程:
首先前端页面会找到对应的action(通过对应struts.xml文件找到对应的action),也就是UserAction,这时候发现
service没有创建对象,然后就到applicationContext.xml文件中去寻找对应的service(在此之前web.xml文件已经把struts.xml,hiber
nate.cfg.xml与spring的xml文件都注入进来了),并创建了此对象(UserServiceImpl这个方法)(service这里面的名字一定要和action中名字相同),
然后又发现还有属性dao ,转到mydao,这个时候dao也创建了对象了(也就是这个方法.UserServiceImpl),
还有一点就是: <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
这行代码就把spring的xml文件带进来了,通过我们之前引入的插件实现的!)

inverse of control   = 控制反转
dependency injection = 依赖注入


Spring Ioc帮我们创建对象,帮我们组织和装配对象


6.自动装配
autowire :byName,byType (在bean中设计装配方法,一般工作中用byName比较多)
default-autowire(在beans中设计,是全局默认的装配方法)


7.注入方式:
1).setter方式注入 property(可以使用自动装配)
2).构造方法注入   constructor-arg(不能使用自动装配
,只能使用配置参数的这种方式:如:<constructor-arg name="dao" ref="mydao"></constructor-arg>)




8.不同属性的注入方式,只做了解
简单属性注入:int,String,float
集合属性注入:Map,List,Set


9.单实例与多实例


scope = singleton,prototype,request,session,global session
scope默认是singleton(我们工作中一般也是用的singleton) 单例,prototype 原型,模板


下面举两个例子来说明scopee分别适用于singleton和prototype
比较两个类的区别


class Student
{
   private int age;
   public void setAge(int age)
   {
       this.age=age;
   }
   public void show()
   {
       System.out.println(age);
   }
}


class StudentDAO
{
    public void save(Student student)
    {
       ......
    }
}


scope适用于prototype(因为类中带有具体的属性age,年龄是要变化的,不能只是一个具体的对象)
Student zhang=new Student();
zhang.setAge(20);


Student lee=new Student();
lee.setAge(18);


scope适用于singleton(类中没有具体的属性,所以适用于singleton)


StudentDAO dao1=new StudentDAO();
dao1.save();
StudentDAO dao2=new StudentDAO();
dao2.save();






10.延时加载(只做了解,工作中一般也用不到)
lazy-init 容器加载时不初始化(初始化时有些容器不需加载,用到的时候
再加载,这样初始化的时候可以节省很多初始化加载的时间)
default-lazy-init


11.初始化方法和销毁方法
init-method (初始化的时候会调用此方法)和(在此方法中输出语句,一般都看的到输出结果) 


destroy-method(结束的时候会调用此方法)(在此方法中输出语句,一般都看不到输出结果)

猜你喜欢

转载自blog.csdn.net/tangbin0505/article/details/82495930