Spring Bean运用XML文件注入方式

1.IOC和DI

(1)IOC(Inversion of Control) 控制反转

产生对象的控制权从调用者本身(程序代码)转移到外部容器(xml配置文件) ,组件之间耦合性降低

(2)DI(Dependency Injection) 依赖注入

在装配对象的时候,将Spring中定义的对象注入到配置文件属性中

(3)IOC与DI的关系

实现IOC思想需要DI做支持

(4)IOC与DI的区别
  • IOC 和 DI 两者的本质是一样的,都是为了降低组件和组件间的耦合性
  • 描述角度不同
  • IOC:组件是如何产生的
  • DI:组件是由其他不同的组件所组装起来

2.Spring Bean运用XML文件的几种注入方式

用于下面几种注入方式的公共Bean层,DAO层及Spring配置

User类

	public class User {
    	private Integer id;
    	private String username;
	   	private String password;

    	public Integer getId() {
        	return id;
    	}

	   	 public void setId(Integer id) {
        	this.id = id;
    	}

    	public String getUsername() {
        	return username;
    	}

    	public void setUsername(String username) {
        	this.username = username;
    	}

    	public String getPassword() {
        	return password;
    	}

    	public void setPassword(String password) {
        	this.password = password;
    	}

    	public User() {
    	}
		
    	public User(Integer id, String username, String password) {
        	this.id = id;
        	this.username = username;
        	this.password = password;
    	}
	}

IUserDao接口类

	void insert();
	void setUserDao(IUserDao userDao);

MySqlDaoImpl实现类

	public void insert() {
        System.out.println("往Mysql添加一条记录");
    }

OracleDaoImpl实现类

	public void insert() {
        System.out.println("往Oracle添加一条记录");
    }

spring.xml配置文件
如何生成可查看我之前写的[IDEA运用Maven项目搭建Spring]

	<!--以下依赖注入后统一由Spring容器管理-->
	<!--依赖注入MySqlDao的实现类-->
    <bean id="mySqlDao" class="com.cx.dao.impl.MySqlDaoImpl"/>
    
    <!--依赖注入OracleDao的实现类-->
    <bean id="oracleDao" class="com.cx.dao.impl.OracleDaoImpl"/>
(1)SET属性注入
①Service层

IUserService接口类

	void UserAdd();

UserServiceImpl实现类

	/**
     * Dao层调用
     */ 
    IUserDao userDao;

    /**
     * 不添加SET方法的话,Spring配置文件配置完测试时会空指针异常
     *
     * @param userDao
     */
    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }

    public void UserAdd() {
        userDao.insert();
    }
②Spring配置文件
    <!--SET属性注入方式-->
    <bean id="userService" class="com.cx.service.impl.UserServiceImpl">
        <property name="userDao" ref="oracleDao"/>
    </bean>
③测试
	@Test
    public void userServiceTest() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        IUserService userService = (IUserService)applicationContext.getBean("userService");
        userService.UserAdd();
    }
④特点
  • 只要修改Spring配置文件中的userService的ref引用,就可以切换不同的Dao层实现类,从而不动源程序代码
(2)构造器注入
①Bean层

注: 一定要有构造方法

②Spring配置文件
	<!--构造器注入-->
    <bean id="user" class="com.cx.bean.User">
        <constructor-arg name="id" value="1"/>
        <constructor-arg name="username" value="李四"/>
        <constructor-arg name="password" value="123"/>
    </bean>
③测试
@Test
    public void userTest() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User user = (User)applicationContext.getBean("user");
        System.out.println(user);
    }
(3)动态工厂注入
①Service层与SET注入方式内容相同
②创建ServiceFactory工厂类来获取UserService实现类
	public IUserService getUserService() {
        return new UserServiceImpl();
    }
③Spring配置文件
	<!--动态工厂注入-->
	<!--依赖注入ServiceFactory工厂类-->
    <bean id="factory" class="com.cx.factory.ServiceFactory"/>
    
    <bean id="userServiceFactory" factory-bean="factory" factory-method="getUserService">
        <property name="userDao" ref="oracleDao"/>
    </bean>
④测试
	@Test
    public void userServiceTest2() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        IUserService userService = (IUserService)applicationContext.getBean("userServiceFactory");
        userService.UserAdd();
    }
⑤特点
  • 可以根据工厂模式来获取实现类
(4)静态工厂注入
①Service层与SET注入方式内容相同
②创建ServiceStaticFactory工厂类来获取UserService实现类
	public static IUserService getUserService() {
        return new UserServiceImpl();
    }

与动态工厂注入不同,此处添加了static

③Spring配置文件
	<!--静态工厂注入-->
    <bean id="userServiceStaticFactory" class="com.cx.factory.ServiceStaticFactory" factory-method="getUserService">
        <property name="userDao" ref="mySqlDao"/>
    </bean>

比动态工厂注入方式少了个bean

④测试
	@Test
    public void userServiceTest3() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        IUserService userService = (IUserService)applicationContext.getBean("userServiceStaticFactory");
        userService.UserAdd();
    }
(5)c命名空间注入
①在Spring配置文件的Beans中添加
	xmlns:c="http://www.springframework.org/schema/c"
②Spring配置文件
	<bean id="cUser" class="com.cx.bean.User" c:id="1" c:username="王五" c:password="222"/>
③测试
	@Test
    public void userTest3() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User user = (User)applicationContext.getBean("cUser");
        System.out.println(user);
    }
④目的
  • 简化构造器注入内容
(6)p命名空间注入
①在Spring配置文件的Beans中添加
	xmlns:p="http://www.springframework.org/schema/p"
②Spring配置文件
	<bean id="pUser" class="com.cx.bean.User" p:id="2" p:username="赵六" p:password="333"/>
③测试
	@Test
    public void userTest4() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User user = (User)applicationContext.getBean("pUser");
        System.out.println(user);
    }
④目的
  • 简化SET属性注入内容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ww空ww

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值