Spring ioc详解,IOC控制反转对象bean

来源:互联网 发布:凯立德gps导航软件 编辑:程序博客网 时间:2024/05/18 23:53

Spring ioc详解

IOC:控制反转-对象<bean>

1      程序对象由原来本身程序自己创建,变为spring容器来创建。现在程序只能被动接受。什么时候创建的bean对象。当读取核心配置文件的时候,就创建了该对象!对象的生命周期完全由spring掌控!

2      使程序员只关注业务处理,而不需要关注对象的创建!

3      Ioc能够实现程序的解耦!降低程序的耦合度!

public interface UserDao {

    void getUser();

}

public class UserMysqlDaoImpl implements UserDao {

 

    @Override

    public void getUser() {

        System.out.println("Mysql数据库获取的数据!");

    }

 

}

public class UserOracleDaoImpl implements UserDao {

 

    @Override

    public void getUser() {

        System.out.println("oarcle数据库获取的数据!");

    }

 

}

public interface UserService {

    void getUser();

}

 

public class UserServiceImpl implements UserService{

    //  关键

    private UserDaouserDao;

   

    public UserDao getUserDao() {

       returnuserDao;

    }

 

    public void setUserDao(UserDao userDao) {

       this.userDao =userDao;

    }

 

    @Override

    public void getUser() {

       //  关键是:什么时候给对象!此时该对象管理就交给我们的spring容器来管理!

       userDao.getUser();

    }

 

}

Beans.xml

<!-- Ioc:控制反转,之前创建对象是由程序本身创建,现在对象是由spring容器来创建了。程序被动接受创建对象! -->

    <!-- value :是给的具体指!ref:指的是给对象的引用! -->

    <beanid="oracle"class="com.bjsxt.dao.impl.UserOracleDaoImpl"></bean>

    <beanid="mysql"class="com.bjsxt.dao.impl.UserMysqlDaoImpl"></bean>

   

    <!-- ref="oarcle" 相当于 userDao = new  UserOracleDaoImpl();-->

    <beanid="userServiceImpl"class="com.bjsxt.service.impl.UserServiceImpl">

        <propertyname="userDao"ref="mysql"></property>

    </bean>

测试:

        ApplicationContext ac =new ClassPathXmlApplicationContext("beans.xml");

        UserServiceImpl userServiceImpl =ac.getBean("userServiceImpl", UserServiceImpl.class);

        userServiceImpl.getUser();

注意:

<beanid="userServiceImpl"class="com.bjsxt.service.impl.UserServiceImpl">

         <!-- userDao 具体指的是谁?UserServiceImpl类中的属性?是setter方法名,去了set字母。

              由此得出结论:spring依赖注意可以通过setter注入。

         -->

         <propertyname="userDao1"ref="mysql"></property>

     </bean>

Bean的生成方式

1.1     无参构造生成

public class Hello {

         public Hello() {

         }

         @Override

         public String toString() {

                   return "我是无参构造!";

         }

}

Beans.xml

<bean id="hello" class="com.bjsxt.pojo.Hello"></bean>

测试类:

ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

Hello hello = ac.getBean("hello", Hello.class);

        System.out.println(hello);


1.2     有参构造

1.2.1  Type:通过数据类型注入:但是,在实际开发过程中不推荐使用。

public class Student {

         private int id;

         private String name;

}

 

<beanid="student" class="com.bjsxt.pojo.Student">

         <constructor-argtype="int" value="12"/>

         <constructor-argtype="String" value="高总"/>

</bean>

测试:

                   Student student = ac.getBean("student", Student.class);

                   System.out.println(student);

1.2.2  Index:通过下标来创建。

<!-- 有参构造 -->

<bean id="student" class="com.bjsxt.pojo.Student">

       <!-- index 代表第几个属性,小标从0开始 -->

       <constructor-argindex="0"value="12"/>

       <constructor-argindex="1" value="张惠妹"/>

</bean>

1.2.3  Name:spring2.x版本应该不支持name创建实体类

<beanid="student" class="com.bjsxt.pojo.Student">

         <!-- name:指的就是属性名 -->

         <constructor-argname="id" value="111"/>

         <constructor-argname="name" value="赵本山"/>

</bean>

1.2.4  静态工厂

public class StudentStaticFactory {

         public static Student getStudent(intid,String name){

                   return new Student(id, name);

         }

}

<!-- 静态工厂  factory-method:指的是工厂中创建实体类的方法-->

<bean id="student" class="com.bjsxt.pojo.StudentStaticFactory"factory-method="getStudent">

         <constructor-argindex="0"value="1"/>

         <constructor-argindex="1"value="董卿"/>

</bean>

1.2.5  动态工厂

public class StudentDynamicFactory {

         public Student getStudent(intid,String name){

                   return new Student(id, name);

         }

}

<bean id="dynamic" class="com.bjsxt.pojo.StudentDynamicFactory"/>

<!-- 动态工厂:factory-bean:指的是动态工厂的bean:id -->

<bean id="student" class="com.bjsxt.pojo.Student"factory-bean="dynamic">

         <constructor-argindex="0"value="2"/>

         <constructor-argindex="1"value="黄渤"/>

</bean>

Scope属性

1      Singleton 单例:<bean>标签默认的就是单例

2      prototype原型:多例模式,每次创建的时候,则会实例化一个 新的对象

3      request 每次请求时创建一个新的对象

4      session 在会话的范围内时一个对象

5      global session 只在portlet下有用,表示是application

6      application 在应用范围中一个对象

         User user = ac.getBean("user",User.class);

                   System.out.println(user);

                   User user1 = ac.getBean("user",User.class);

                   System.out.println(user1);

                   System.out.println("8888888888888888888888");

                   System.out.println(user==user1);