Spring 中使用 xml 配置開發(fā)和使用注解開發(fā)案例
1掌敬、Spring 中使用 xml 配置開發(fā)案例
接口
public interface UserDao {
void add(User user);
}
========================================================================================
public interface UserService {
void add(User user);
}
接口的實(shí)現(xiàn)類
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調(diào)用方法
public class UserAction {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public void save(User user) {
System.out.println("UserAction 方法調(diào)用");
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>
測試函數(shù)
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);
}
}
結(jié)果如下所示:
UserAction 方法調(diào)用汞窗。
Service 添加用戶信息======>User{username='玉皇大帝', password='888', age=9999}点把。
Dao 添加用戶信息======>User{username='玉皇大帝', password='888', age=9999}
可以看出是一層一層調(diào)用到 :action -> service -> dao
2羡玛、Spring 中使用注解開發(fā)案例
接口不變。修改接口的實(shí)現(xiàn)類
@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 方法調(diào)用");
userService.add(user);
}
}
執(zhí)行上面的測試函數(shù)即可在控制臺(tái)打印和第一個(gè)案例一樣的信息账阻。
3符相、@Qualifier("id") & @Resource(name="id") 注解含義
如果在 UserServiceImpl 類上將注解修改為 @Service("myUserService")。如果需要注入指定 id 的類需要同時(shí)加上注解:@Autowired褒链、@Qualifier("myUserService")唁情。
@Autowired 是按照類型注入。
如果是接口甫匹,從容器中查找接口的實(shí)現(xiàn)類注入甸鸟;如果是類,就在容器中查找類進(jìn)行注入兵迅。
@Qualifier("id名稱")是按照指定id注入抢韭。
@Resource(name="id") = @Autowired+@Qualifier("id") 。
4恍箭、@Scope("prototype") 和 @Scope("singleton")
@Scope("singleton")
修改測試代碼刻恭,再次執(zhí)行
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);
}
}
控制臺(tái)信息如下:
com.example.demo.code.UserAction@7098b907
com.example.demo.code.UserAction@7098b907
說明 Spring 注入默認(rèn)是單例。
@Scope("prototype")
在 UserAction 加上注解 @Scope("prototype") 扯夭,再次執(zhí)行測試函數(shù)鳍贾。
控制臺(tái)信息如下:
com.example.demo.code.UserAction@7098b907
com.example.demo.code.UserAction@503f91c3
說明 Spring 注入可以配置多例。
重點(diǎn):Spring 中默認(rèn)注入是單例的交洗。