该文使用例子代码,源于此文书写的ioc配置文件方式做的修改。
https://blog.csdn.net/yjz_sdau/article/details/79904755
注解方式跟配置文件方式原理一样,但是注解更方便也便于管理,因为注解方式,我们把很多管理的书写交给了spring给我们做,所以对于我们开发来说,带来了更大的便利。
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
<!-- 扫描注解,扫描范围是 base-package定义的com.hpe,即我们以com.hpe命名的包头,都会接受spring的注解扫描-->
<context:component-scan base-package="com.hpe"></context:component-scan>
</beans>
从配置文件中可以看出,我们省去了bean标签,xml方式的bean标签一般两个属性值,id跟class,id是每个bean标签用于区分的名字,可以随便取,class是我们bean管理注入时候对应的实现类,也就是new Object时候对应的object是谁。那注解方式,我们可以这样理解,注解添加在谁的上面,就是class等于它,也就表明我的创建类就是我注解的那个类,注解参数value=“注解名字”,理解为我们xml方式bean标签的id,用于区分每个注解,所以,注解方式跟bean方式还是一样的原理。(说明,此种理解试用与注解类,注解属性时候则不同)
package com.hpe.dao.impl;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.hpe.dao.IUserDao;
import com.hpe.po.User;
import com.hpe.util.DBUtil;
@Repository(value="userDao")//注解在UserDaoImpl类上面,说明实现类就是它,也就是xml方式bean标签的class=“UserDaoImpl”
public class UserDaoImpl implements IUserDao{
private DBUtil db=new DBUtil();
@Override
public User fndUserByNameAndPwd(User user) {
String sql="select * from user where username=? and password=?";
Object[] params={user.getUsername(),user.getPassword()};
User us=db.getObject(sql, params,User.class);
return us;
}
@Override
public int register(User user) {
String sql="insert into user(username, password, sex, realname)values(?, ?,?,?)";
Object[] params={user.getUsername(),user.getPassword(),user.getSex(),user.getRealname()};
int res=db.update(sql, params);
return res;
}
@Override
public int checkUserName(String username) {
String sql="select * from user where username=? ";
Object[] params={username};
List<User> list= db.query(sql, params, User.class);
return list.size();
}
@Override
public List<User> selectAll() {
String sql="select * from user";
Object[] params={};
return db.query(sql, params, User.class);
}
@Override
public int deleteById(int id) {
String sql="delete from user where id=?";
Object[] params={id};
return db.update(sql, params);
}
@Override
public List<User> selectMohu(String username) {
String sql="select * from user where username like '%"+username+"%'";
Object[] params={};
List<User> list= db.query(sql, params, User.class);
return list;
}
}
接下俩我们在注解UserServiceImpl
在UserServiceImpl里面,有两个注解,一个是注解类,表明我bean管理的类就是我注解的该类,那下方我还注解了一个属性,说明我注解该类用的是有参构造方法,有参构造方法的参数就是注解的属性,注解属性的name相当于property的ref属性,表示我要找到一个名字为name等于的注解类,该注解类的value值就是注解属性的name值。
package com.hpe.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.hpe.dao.IUserDao;
import com.hpe.dao.impl.UserDaoImpl;
import com.hpe.po.User;
import com.hpe.service.IUserService;
@Service(value="userService")//注解在UserServiceImpl上面,说明创建对象的实现类就是UserServiceImpl
public class UserServiceImpl implements IUserService{
/**
* 注解在属性上面,不能用之前提到的理解注解了,注解属性,相当于xml方式bean标签的有参构造函数
的property标签,说明有参构造函数的属性是什么,所以这里的括号里面是name而不是之前注解类时候
的value,name="userDao",相当于property标签的ref="userDao",即装配属性时候
我们有参构造函数参数是注解名为userdao的实现类的创建对象,由于注解在该属性上面,默认属性名iud就是
构造方法的参数名了,也就是new UserServiceImpl(iud),而iud为IUserDao=new UserDaoImpl();
*/
@Resource(name="userDao")
private IUserDao iud;
public IUserDao getIud() {
return iud;
}
public void setIud(IUserDao iud) {
this.iud = iud;
}
@Override
public User login(User user) {
// TODO Auto-generated method stub
return iud.fndUserByNameAndPwd(user);
}
@Override
public int register(User user) {
// TODO Auto-generated method stub
return iud.register(user);
}
@Override
public List<User> selectAll() {
// TODO Auto-generated method stub
return iud.selectAll();
}
@Override
public int deleteById(int id) {
// TODO Auto-generated method stub
return iud.deleteById(id);
}
@Override
public List<User> selectMohu(String username) {
// TODO Auto-generated method stub
return iud.selectMohu(username);
}
}
最后,我们在com.hpe.test包下的测试类中用junit测试:
@Test
public void method2()
{
//加载配置文件,初始化ioc容器(创建对应实例)
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//从ioc容器中获取bean
//getBean("userService", IUserService.class),第一个参数userService使我们注解时候@Servcie(value="userService")
//参数 IUserService.class是反射,即我们bean管理创建UserServiceImpl类的类型,继承 IUserService,多态
IUserService userService = context.getBean("userService", IUserService.class);
//通过getBean,读取userService id的IUserServiceImpl的实现类(在bean标签中,class设置为UserServiceImpl。所以获得该实现类)
//然后bean设置属性,《propert》标签,设置userServiceimpl中的属性字段userdao为userDaoImpl实现类的实体。
User user=new User();
user.setUsername("yjz");
user.setPassword("123");
List<User> list=userService.selectAll();
for(User u:list){
System.out.println(u);
}
}
是不是对注解标签感到雾水?
(下方参考博客:https://www.cnblogs.com/xiaoxi/p/5935009.html)
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
@Autowired @Qualifier("personDaoBean") 存在多个实例配合使用
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。一般是注解属性字段的
@PostConstruct 初始化注解
@PreDestroy 摧毁注解 默认 单例 启动就加载
@Async异步方法调用