spring-ioc

Ioc是  spring框架的核心,AOP和声明式事务的实现都依赖与ioc实现的基础上;

控制反转(ioc):

        控制:指得是不由程序去创建对象,而是由容器去创建对象;  也就是我们平时创建对象一般都是new一个对象,用过hibernate和Struts2的就深有体会,hibernate中的表对象和struts2中的Action都是由容器来创建的;

        反转:值得是不由程序来创建对象,而是由程序来接收对象(通过setXXX或者有参的构造方法);

        这种通过接收对象的方式叫做依赖注入(di),以此种方式降低耦合度;

        既然有反转那么就有正转,就是指由程序本身来创建对象,就是说在一个类中new了一个对象;

        来看代码:

        在src下的beans.xml配置文件:(说明一下,spring对配置文件的名称与位置并没有特定的要求)

    

<bean id="mysqlDao"   class="com.czy.userdao.MysqlDao"/>
	<bean id="mysqlDao"  class="com.czy.userdao.MysqlDao"/>
	<bean id="userService" class="com.czy.userservice.UserService">
		<property name="userDao" ref="mysqlDao"></property>
	</bean><!--通过以上配置来使得两个类发生依赖关系-->
public class UserService  implements BaseService{

    private BaseDao basedao=null;

    @Override

    public void setUserDao(BaseDao baseDao) {

        // TODO Auto-generated method stub

        this.basedao=basedao;

    }

    public BaseDao getUserDao(){

        return basedao;

public class MysqlDao implements BaseDao{
    public MysqlDao() {
        // TODO Auto-generated constructor stub
        System.out.println("new mysqldao");
    }
    @Override
    public void sigal() {
        // TODO Auto-generated method stub
        System.out.println("i am mysqldao");
    }
}
public class Mymain {
	public static void main(String[] args) {
		BeanFactory bf=new ClassPathXmlApplicationContext("beans.xml");
		ServiceImp service= (ServiceImp) bf.getBean("service");//使用beans.xml中的id来实例化,也可以使用类.class,但是要保证类是单例,并且无需做类型转换
		service.getDao();
	}
}

运行结果:

i am mysqldao

这里值得一提的是:BeanFactory是一个接口,我们也可以使用它的子类ApplicationContext,一般推荐使用ApplicationContext,ApplicationContext功能更加强大,并且ApplicationContext实例化后,spring容器中的单例类(singleton Bean)也将会被实例化,这样在程序中,用到这些类的时候直接就可以使用,而不用花费时间去加载,当然,这样一来程序启动时间自然会增加,而BeanFactory就会在调用到单例类时才加载(有点像是懒加载);

<bean id="oracleDao"  class="com.czy.userdao.OracleDao"/>//默认是singleton Bean

Bean的作用域:singleton,protorype,request,session,globalsession,application;

 格式:<beanid=””  class=”” scope=””/>默认为单例


  

使用ioc来创建对象的三种方式:

        a)通过无参的构造方法(如上)

        b)通过有参的构造方法:

    

public ServiceImp(BaseDao dao) {
		// TODO Auto-generated constructor stub
		this.dao=dao;
		System.out.println(" 赋值完成");
	}

只是配置文件中略有不同:

  <bean id="mysqlDao"  class="com.service.servicedao.MysqlDao"/>
   <bean id="oracleDao" class="com.service.servicedao.OracleDao"/>
   <bean id="serviceimp"  class="com.service.Imp.ServiceImp">
   		<constructor-arg index="0" ref="mysqlDao"></constructor-arg>
   </bean>
注意点:在constructor中,index是从0开始的;0 表示的是一个参数的构造方法
这是来设置值 

构造函数、set方法注入两者各有好处:对依赖关系无需变化的Bean,够着注入更好,但是构造函数注入不适用关系复杂的Bean, 那样子构造函数注入反而显得不直观,这种时候使用set更好,需要改变依赖关系也需要存在set方法;       

c)通过工厂类来创建对象

            

public class MysqlFactory {
	public static BaseDao createMysql(){
		System.out.println("mysql创建成功");
		return new MysqlDao();
	}
}
<bean id="user"  class="com.czy.factory.MysqlFactory" factory-method="createMysql"/>
   <bean id="service" class="com.service.Imp.ServiceImp">
   		<constructor-arg index="0" ref="user"></constructor-arg>
   	</bean>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring-IOCSpring框架的核心部分之一,它是一种设计模式,全称为Inversion of Control(控制反转)。它通过将对象的创建、依赖关系的管理和对象的生命周期交给Spring容器来实现,从而降低了组件之间的耦合度,提高了代码的可重用性和可维护性。Spring-IOC的实现主要依靠Spring容器,Spring容器是Spring框架的核心,它负责创建、管理和装配Bean对象,其中Bean是Spring框架中最基本的组件。 Spring-IOC的实现主要有两种方式:BeanFactory和ApplicationContext。其中,BeanFactory是Spring-IOC的基本实现,而ApplicationContext是BeanFactory的子接口,提供了更多高级特性。ApplicationContext是Spring框架中最常用的IOC容器,它除了提供BeanFactory的所有功能外,还提供了更多的企业级特性,例如AOP、事务管理、国际化、事件传播等。 下面是一个简单的Spring-IOC的例子,假设我们有一个UserService接口和一个UserServiceImpl实现,我们可以通过Spring-IOC容器来创建和管理UserServiceImpl对象: 1.定义UserService接口和UserServiceImpl实现 ```java public interface UserService { void addUser(User user); } @Service public class UserServiceImpl implements UserService { @Override public void addUser(User user) { // 添加用户的具体实现 } } ``` 2.在Spring配置文件中配置UserService实例 ```xml <bean id="userService" class="com.example.service.UserServiceImpl"/> ``` 3.在代码中获取UserService实例并使用 ```java ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = context.getBean("userService", UserService.class); User user = new User(); userService.addUser(user); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值