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>
再次运行:
通过上面两种方式可以看出,注解更加的简单~