IOC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IOC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
其实IOC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IOC/DI思想中,应用程序就变成被动的了,被动的等待IOC容器来创建并注入它所需要的资源了。
IOC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IOC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
IOC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的女孩,然后打听她们的兴趣爱好、QQ号、电话号、IQ号、IP号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。
-
- 定义持久化方法
首先我们创建一个包名为com.it.csx_auto的架包,在这个架包下再创建一个工程项目名为BookDao,然后创建接口名为BookService,之后再创建类BookServiceImpl,最后再建立一份XML文件,建立一份类测试代码这个方法就完成了。具体如下:
package com.it.csx_auto;
public interface BookDao {
public void save();
}
package com.it.csx_auto;
public class BookDaoImpl implements BookDao{
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
// TODO Auto-generated method stub
System.out.println("BookDao save...."+name);
}
}
package com.it.csx_auto;
public interface BookService {
public void addbook();
}
package com.it.csx_auto;
public class BookServiceImpl implements BookService{
private BookDao bookDaoId;
public BookDao getBookDaoId() {
return bookDaoId;
}
public void setBookDaoId(BookDao bookDaoId) {
this.bookDaoId = bookDaoId;
}
@Override
public void addbook() {
// TODO Auto-generated method stub
bookDaoId.save();
}
}
package com.it.csx_auto;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
public static void main(String[] args) {
String xmlPath="com/it/csx_auto/beans.xml";
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext(xmlPath);
BookService bean = (BookService)classPathXmlApplicationContext.getBean("bookServiceId");
bean.addbook();
}
}
<?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"
default-autowire="byName">
<!-- 注意:别忘了添加default-autowire="byName"-->
<!-- 代码如下:-->
<!-- BookDaoImpl的实例化 注意: id="bookDao"中的bookDao这个名字要和BookServiceImpl类中的成员变量名字一致 -->
<bean id="bookDaoId" class="com.it.csx_auto.BookDaoImpl"></bean>
<bean id="bookServiceId" class="com.it.csx_auto.BookServiceImpl"></bean>
</beans>
-
- 增加用户user工厂类,用户实例创建工作
我们首先创建一个包名为com.it.csx_factory的架包,其次创建名为MyBeanFactory的类,再创建名为UserService的接口,之后再创建名为UserServiceImpl的类,最后再建立XML文件,建立一份类的测试代码进行用户实例创建的工作检测。具体如下:
package com.it.csx_factory;
public class MyBeanFactory {
public UserService createUserService(){
return new UserServiceImpl();
}
}
package com.it.csx_factory;
public interface UserService {
public void addUser();
}
package com.it.csx_factory;
public class UserServiceImpl implements UserService{
@Override
public void addUser() {
// TODO Auto-generated method stub
System.out.println("addUser.....");
}
}
<?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="myBeanFactoryId" class="com.it.csx_factory.MyBeanFactory"> </bean>
<bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createUserService"></bean>
</beans>
package com.it.csx_factory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
public static void main(String[] args) {
String xmlPath="com/it/csx_factory/beans.xml";
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext(xmlPath);
UserService bean = classPathXmlApplicationContext.getBean("userServiceId",UserService.class);
bean.addUser();
}
}
-
- 控制台输出userDaoId
首先创建包名为com.it.jdbc的架包,然后创建名为user的类,再创建一个名为UserDao的类,之后再建立XML文件,建立一份类的测试代码进行控制台的输出,输出名为userDaoId。
package com.it.jdbc;
public class user {
private Integer id;
private String username;
private String password;
// 生成get set 方法
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;
}
// 生成toString方法
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + "]";
}
}
package com.it.jdbc;
import org.springframework.jdbc.core.JdbcTemplate;
/*
* 工具类 (对数据库操作)
*
*/
public class UserDao {
//使用spring进行注入
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// 更新数据库 (update方法)
public void update(user user){
String sql="update t_user set username=?,password=? where id=?";
Object[] args={user.getUsername(),user.getPassword(),user.getId()};
jdbcTemplate.update(sql, args);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- dbcp数据源
查找BasicDataSource类的全路径: shift+ctrl+t
-->
<bean id="dataSourceId" class="org.apache.commons.dbcp.BasicDataSource">
<!-- 注入 却动-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<!-- 注入地址 -->
<property name="url" value="jdbc:mysql://localhost:3306/day_jdbc?useUnicode=true&characterEncoding=utf-8"></property>
<!-- 注入账号 -->
<property name="username" value="root"></property>
<!-- 注入密码 -->
<property name="password" value="12345"></property>
</bean>
<!--对JdbcTemplate类实例化 -->
<bean id="jdbcTemplateId" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSourceId"></property>
</bean>
<!-- 对UserDao工具类进行实例化 -->
<bean id="userDaoId" class="com.it.jdbc.UserDao">
<!--把JdbcTemplate的实例注入给userDao类中的jdbcTemplate成员变量 -->
<property name="jdbcTemplate" ref="jdbcTemplateId"></property>
</bean>
</beans>
package com.it.jdbc;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
public static void main(String[] args) {
user user = new user();
user.setId(4);
user.setUsername("香香");
user.setPassword("100");
String xmlPath="com/it/jdbc/beans.xml";
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext(xmlPath);
UserDao bean =(UserDao) classPathXmlApplicationContext.getBean("userDaoId");
bean.update(user);
}
}