首页 > 代码库 > Spring
Spring
Spring的两个核心概念
- IOC (Inversion of Control 控制反转)
- AOP (Aspect Orient Programming 面向切面编程)
控制反转和依赖注入
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。
有一个实体操作接口和实现类
public interface UserDAO { public void save(User user);}public class UserDAOImpl implements UserDAO { public void save(User user) { System.out.println("user saved!"); }}
有一个实体类
public class User { private String username; private String password; 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 class UserService { private UserDAO userDAO; public void add(User user) { userDAO.save(user); } public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; }}
由一个测试类
public class UserServiceTest { @Test public void testAdd() throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); UserService service = (UserService)ctx.getBean("userService"); User u = new User(); u.setUsername("zhangsan"); u.setPassword("zhangsan"); service.add(u); }}
从测试类本身来看,需要两个地方进行初始化
service对象的初始化,以及add方法中使用的是UserDAO 的哪一个实现类是没有指定的(也就是内部的UserDao没有初始化)。
但是加入了一个容器:
<beans > <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"> </bean> <bean id="userService" class="com.bjsxt.service.UserService"> <property name="userDAO" ref="u" /> </bean> </beans>
- bean相当于new一个对象
- ref相当于引入一个已经new的对象
之后,在spring框架下,这个程序是可以正常运行的。
也就是说把具体对象的初始化交给这个容器来完成。这个就是控制反转的意义
控制反转意思就是说以前可以在类中控制具体的初始化,现在交给由容器完成
具体的类 从控制实现到控制抽象(接口),从实现具体的东西,到实现抽象的东西
也就是说UserService 类里面不需要初始化DAO对象
UserServiceTest 类里面也不需要初始化UserService对象
这些都交给容器来完成
service.add(u) 具体add的具体实现依赖于容器注入给的DAO对象,这个就是依赖注入
注入类型
主要有两种
- setter注入
- 构造方法注入
setter注入就是使用set方法
public class SimpleMovieLister { // the SimpleMovieLister has a dependency on the MovieFinder private MovieFinder movieFinder; // a setter method so that the Spring container can inject a MovieFinder public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // business logic that actually uses the injected MovieFinder is omitted...}
bean.xml不变
构造方法注入用的很少
<bean id="exampleBean" class="examples.ExampleBean"> <constructor-arg type="int" value="7500000"/> <constructor-arg type="java.lang.String" value="42"/></bean>
name和id
<bean name="u" class="com.bjsxt.dao.impl.UserDAOImpl"> </bean>
这两个基本一致,没啥区别
Spring