您的位置:首页 > 编程语言 > Java开发

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

2017-09-07 14:45 344 查看

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 UserDao
userDao;
   
    public UserDao getUserDao() {
       return
userDao;
    }
 
    public
void
setUserDao(UserDao userDao) {
       this.userDao =
userDao;
    }
 
    @Override
    public
void
getUser() {
       //  关键是:什么时候给对象!此时该对象管理就交给我们的spring容器来管理!
       <
d1c5
span style="color:#0000C0;">userDao.getUser();
    }
 
}

Beans.xml

<!-- Ioc:控制反转,之前创建对象是由程序本身创建,现在对象是由spring容器来创建了。程序被动接受创建对象!
-->
    <!-- value :是给的具体指!ref:指的是给对象的引用!
-->
    <bean
id="oracle"
class="com.bjsxt.dao.impl.UserOracleDaoImpl"></bean>
    <bean
id="mysql"
class="com.bjsxt.dao.impl.UserMysqlDaoImpl"></bean>
   
    <!-- ref="oarcle"
相当于 userDao = new  UserOracleDaoImpl();-->
    <bean
id="userServiceImpl"
class="com.bjsxt.service.impl.UserServiceImpl"
>
        <property
name="userDao"
ref="mysql"></property>
    </bean>

测试:

        ApplicationContext ac =
new ClassPathXmlApplicationContext("beans.xml");
        UserServiceImpl userServiceImpl =
ac.getBean("userServiceImpl", UserServiceImpl.class);
        userServiceImpl.getUser();

注意:

<bean
id="userServiceImpl"
class="com.bjsxt.service.impl.UserServiceImpl"
>
         <!-- userDao 具体指的是谁?UserServiceImpl类中的属性?是setter方法名,去了set字母。
              由此得出结论:spring
依赖注意可以通过setter注入。
         -->
         <property
name="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;

}

 

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

         <constructor-arg
type="int" value="12"/>

         <constructor-arg
type="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-arg
index="0"
value="12"/>

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

</bean>

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

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

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

         <constructor-arg
name="id" value="111"/>

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

</bean>

1.2.4  静态工厂

public
class
StudentStaticFactory {

         public
static
Student getStudent(int
id,String name){

                   return
new
Student(id,
name);

         }

}

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

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

         <constructor-arg
index="0"
value="1"/>

         <constructor-arg
index="1"
value="董卿"/>

</bean>

1.2.5  动态工厂

public
class
StudentDynamicFactory {

         public Student getStudent(int
id,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-arg
index="0"
value="2"/>

         <constructor-arg
index="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);

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: