Spring 中使用 xml 配置开发和使用注解开发案例
接口
public interface UserDao { void add(User user); } ======================================================================================== public interface UserService { void add(User user); }
接口的实现类
public class UserDaoImpl implements UserDao { @Override public void add(User user) { System.out.println("Dao 添加用户信息======>" + user); } } ========================================================================================= public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void add(User user) { System.out.println("Service 添加用户信息======>" + user); userDao.add(user); } } ========================================================================================= 模拟UserAction调用方法 public class UserAction { private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } public void save(User user) { System.out.println("UserAction 方法调用"); userService.add(user); } }
配置bean.xml 文件
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 1.配置dao--> <bean id="userDao" class="com.example.demo.code.impl.UserDaoImpl"></bean> <!-- 2.配置service --> <bean id="userService" class="com.example.demo.code.impl.UserServiceImpl"> <property name="userDao" ref="userDao"></property> </bean> <!--3.配置action--> <bean id="userAction" class="com.example.demo.code.UserAction"> <property name="userService" ref="userService"></property> </bean> </beans>
public class ServiceTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); UserAction userAction = context.getBean(UserAction.class); User user = new User(); user.setUsername("玉皇大帝"); user.setPassword("888"); user.setAge(9999); userAction.save(user); } }
UserAction 方法调用。
Service 添加用户信息======>User{username='玉皇大帝', password='888', age=9999}。
Dao 添加用户信息======>User{username='玉皇大帝', password='888', age=9999}
可以看出是一层一层调用到 :action -> service -> dao
接口不变。修改接口的实现类
@Repository public class UserDaoImpl implements UserDao { @Override public void add(User user) { System.out.println("Dao 添加用户信息======>" + user); } } ========================================================================================= @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public void add(User user) { System.out.println("Service 添加用户信息======>" + user); userDao.add(user); } } ========================================================================================= @Controller public class UserAction { @Autowired private UserService userService; public void save(User user) { System.out.println("UserAction 方法调用"); userService.add(user); } }
执行上面的测试函数即可在控制台打印和第一个案例一样的信息。
如果在 UserServiceImpl 类上将注解修改为 @Service("myUserService")。如果需要注入指定 id 的类需要同时加上注解:@Autowired、@Qualifier("myUserService")。
@Autowired 是按照类型注入。
如果是接口,从容器中查找接口的实现类注入;如果是类,就在容器中查找类进行注入。
@Qualifier("id名称")是按照指定id注入。
@Resource(name="id") = @Autowired+@Qualifier("id") 。
修改测试代码,再次执行
public class ServiceTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); UserAction userAction = context.getBean(UserAction.class); UserAction userAction2 = context.getBean(UserAction.class); System.out.println(userAction); System.out.println(userAction2); } }
控制台信息如下:
com.example.demo.code.UserAction@7098b907
com.example.demo.code.UserAction@7098b907
说明 Spring 注入默认是单例。
在 UserAction 加上注解 @Scope("prototype") ,再次执行测试函数。
控制台信息如下:
com.example.demo.code.UserAction@7098b907
com.example.demo.code.UserAction@503f91c3
说明 Spring 注入可以配置多例。