Spring 中使用 xml 配置开发和使用注解开发案例

1、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

2、Spring 中使用注解开发案例

接口不变。修改接口的实现类
@Repositorypublic class UserDaoImpl implements UserDao {    @Override    public void add(User user) {        System.out.println("Dao 添加用户信息======>" + user);    }}=========================================================================================@Servicepublic class UserServiceImpl implements UserService {    @Autowired    private UserDao userDao;    @Override    public void add(User user) {        System.out.println("Service 添加用户信息======>" + user);        userDao.add(user);    }}=========================================================================================@Controllerpublic class UserAction {    @Autowired    private UserService userService;    public void save(User user) {        System.out.println("UserAction 方法调用");        userService.add(user);    }}
执行上面的测试函数即可在控制台打印和第一个案例一样的信息。

3、@Qualifier("id") & @Resource(name="id") 注解含义

如果在 UserServiceImpl 类上将注解修改为 @Service("myUserService")。如果需要注入指定 id 的类需要同时加上注解:@Autowired、@Qualifier("myUserService")。

@Autowired 是按照类型注入。

如果是接口,从容器中查找接口的实现类注入;如果是类,就在容器中查找类进行注入。

@Qualifier("id名称")是按照指定id注入。

@Resource(name="id") = @Autowired+@Qualifier("id") 。

4、@Scope("prototype") 和 @Scope("singleton")

@Scope("singleton")

修改测试代码,再次执行
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 注入默认是单例。

@Scope("prototype")

在 UserAction 加上注解 @Scope("prototype") ,再次执行测试函数。

控制台信息如下:

com.example.demo.code.UserAction@7098b907

com.example.demo.code.UserAction@503f91c3

说明 Spring 注入可以配置多例。

重点:Spring 中默认注入是单例的。