Spring基于注解的IOC以CRUD操作及案例

spring中Ioc的常用注解

@Component 

作用:用于把当前类对象存入spring容器属性。

带此注解的类看为组件,当使用基于注解的配置和类路径扫描的时候,这些类就会被实例化

value:用于指定Bean 的id 。默认当前类名(首字母小写)

@Controller:一般用于表现层

@Service:一般用于业务层

@Repository:一般用于持久层

//默认为userServiceImpl
@Component
public class UserServiceImpl implements UserService {}

 @Autowired

@Autowired 注释对在哪里和如何完成自动连接提供了更多的细微的控制。

作用:@Autowired 自动按照类型注入 。只要容器中有唯一的一个Bean对象类型和要注入的变量类型匹配就注入成功。

@Component
public class UserServiceImpl implements UserService {
    //自动按照类型注入
    @Autowired
    private UserDao userDao;
    public void saveUser() {
        userDao.saveUser();
    }
}

@Qualifier

可能会有这样一种情况,当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱。

作用:在按照类注入的基础上,再按照名称注入。它在给类成员注入时不能单独使用,但是在给方法参数注入时可以

属性:value:y用于指定注入Bean的id

@Component
public class UserServiceImpl implements UserService {
    @Autowired
    @Qualifier("userDao2")
    private UserDao userDao = null;
    public void saveUser() {
        userDao.saveUser();
    }
}

如果嫌麻烦,可以通过@Resource直接通过name 来指定

@Component
public class UserServiceImpl implements UserService {
//    @Autowired
//    @Qualifier("userDao2")
    @Resource(name="userDao2")
    private UserDao userDao = null;
    public void saveUser() {
        userDao.saveUser();
    }
}

以上三个注入都只能中注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现,另外,集合类型的注入只能通过xml


@Value

作用:用于注入基本类型和String类型的数据

属性:value 用于指定数据的值,他可以使用spring中spel(也就是spring的el表达式) ${表达式}

 @Value("18")
    private int age ;

@Scope 

作用:用于指定bean的作用范围

属性:value 用于指定作用范围的取值,通常取值:singleton prototype

 

案例使用xml方式和注解方式实现的CRUD操作

开发工具:idea maven工程

创建实体类:User

public class User implements Serializable {
    private Integer uid;
    private String uname;
    private String pwd;
    private String sex;
    private Integer age;

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }


    @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", uname='" + uname + '\'' +
                ", pwd='" + pwd + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }
}

 创建业务层:

package cn.qlu.service;

import cn.qlu.user.User;

import java.util.List;

public interface UserService {

    /**
     * 查询所有
     * @return
     */
    List<User> findAll();

    /**
     * 根据id查询
     * @return
     */
    User findUserById(Integer uid);

    /**
     * 保存
     * @param user
     */
    void saveUser(User user);

    /**
     * 更新
     * @param user
     */
    void updateUser(User user);

    /**
     * 删除
     * @param uid
     */
    void deleteUser(Integer uid);
}

业务层实现类:

package cn.qlu.service.impl;

import cn.qlu.dao.UserDao;
import cn.qlu.dao.impl.UserDaoImpl;
import cn.qlu.service.UserService;
import cn.qlu.user.User;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

public class UserServiceImpl implements UserService {
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public List<User> findAll() {
        return userDao.findAll();
    }

    public User findUserById(Integer uid) {
        return userDao.findUserById(uid);
    }

    public void saveUser(User user) {
        userDao.saveUser(user);

    }

    public void updateUser(User user) {
        userDao.updateUser(user);

    }

    public void deleteUser(Integer uid) {
        userDao.deleteUser(uid);

    }
}

 

创建持久层及实现类

package cn.qlu.dao;

import cn.qlu.user.User;

import java.util.List;

public interface UserDao {
  
    List<User> findAll();
    User findUserById(Integer uid);
    void saveUser(User user);
    void updateUser(User user);
    void deleteUser(Integer uid);
}

 

 

package cn.qlu.dao.impl;

import cn.qlu.dao.UserDao;
import cn.qlu.user.User;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.springframework.stereotype.Component;

import java.sql.SQLException;
import java.util.List;

/**
 * 持久层实现类
 */
public class UserDaoImpl implements UserDao {
    private QueryRunner runner;

    public void setRunner(QueryRunner runner) {
        this.runner = runner;
    }

    public List<User> findAll() {
        try {
            return runner.query("select * from t_user",new BeanListHandler<User>(User.class));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public User findUserById(Integer uid) {
        try {
            return runner.query("select * from t_user where uid=?",new BeanHandler<User>(User.class),uid);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void saveUser(User user) {
        try {
            runner.update(
                    "insert into t_user(uname,pwd,sex,age)values(?,?,?,?)",
                    user.getUname(),user.getPwd(),user.getSex(),user.getAge());
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void updateUser(User user) {
        try {
            runner.update(
                    "update t_user set uname=?,pwd=?,sex=?,age=? where uid=?",
                    user.getUname(),user.getPwd(),user.getSex(),user.getAge(),user.getUid());
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void deleteUser(Integer uid) {
        try {
            runner.update(
                    "delete from t_user  where uid=?", uid);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 


 

 

创建bean.xml 首先介绍使用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-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!--配置service对象-->
    <bean id="userService" class="cn.qlu.service.impl.UserServiceImpl">
        <!--注入dao-->
        <property name="userDao" ref="userDao"></property>
    </bean>
    <!--配置dao对象-->
    <bean id="userDao" class="cn.qlu.dao.impl.UserDaoImpl">
        <!--z注入QueryRunner-->
        <property name="runner" ref="runner"></property>
    </bean>
    <!--注入Runner对象-->
    <bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
    <!--注入数据源-->
        <constructor-arg name="ds" ref="dataSource"></constructor-arg>
    </bean>
    <!--配置数据源-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/crawler"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
    

    <context:component-scan base-package="cn.qlu"/>

<!--    把对象的创建交给spring来管理-->
   <!-- <bean id="userService" class="cn.qlu.service.impl.UserServiceImpl"></bean>

    <bean id="userDao" class="cn.qlu.dao.impl.UserDaoImpl"></bean>-->


</beans>

测试类:

/**
 * 使用Junit单元测试
 */
public class UserServiceTest {


    @Test
    public void testFindAll(){
        //获取容器
        ApplicationContext ac= new ClassPathXmlApplicationContext("bean.xml");
        //得到业务层对象
        UserService userService = ac.getBean("userService",UserService.class);
        //执行方法
        List<User> users = userService.findAll();
        for(User user:users){
            System.out.println(user);
        }


    }

运行结果:

 其他方法类似 这里就不展示了


创建Bean.xml 使用基于注解的案例操作

在这里可以简单的使用注解进行操作

将之前的业务层改成下图所示:

将持久层改成下图所示:

 

将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-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <!--需要扫描的包-->
    <context:component-scan base-package="cn.qlu"/>
    <!--注入Runner对象-->
    <bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
        <!--注入数据源-->
        <constructor-arg name="ds" ref="dataSource"></constructor-arg>
    </bean>
    <!--配置数据源-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/crawler"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
    </bean>



</beans>

 

再次运行:

 

通过上面两种方式可以看出,注解更加的简单~

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值