spring注解方式实现ioc控制反转

该文使用例子代码,源于此文书写的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异步方法调用



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值