基于注解的配置
step 1:修改xml头部描述
<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-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.neuedu"/>
step2:写dao,service接口和实现类
public interface IPowerDao {
public void del(int id);
}
@Repository("powerDao")
public class PowerDaoImpl implements IPowerDao {
@Override
public void del(int id) {
System.out.println("del power");
}
}
public interface IPowerService {
public void del(int id);
}
@Service("powerServie")
public class PowerServieImpl implements IPowerService {
@Autowired
IPowerDao powerDao;
@Override
public void del(int id) {
System.out.println("del service");
powerDao.del(id);
}
public void setPowerDao(IPowerDao powerDao) {
this.powerDao = powerDao;
}
}
step 3写测试类
public class ScanTest {
@Test
public void test1(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");
IPowerService service=(IPowerService) ctx.getBean("powerServie");
service.del(1);
}
}
@Qualifier
如果一个接口有多个实现类,注入时需要用@Qualifier 明确引用哪个名字的实现类
@Autowired
@Qualifier("userDaoImpl")
public IUserDao userDao;
注意:如果service里既有有参构造(缺少无参构造)又有属性set方法,@Qualifier会提示构造方法异常。
解决方法有二:1)删除有参构造,只保留set方法
2)增加无参构造
java配置方式
工程spring-java
1)file-new -maven project-等-quick start-工程名spring-java-finish
2)建包com.neuedu.module.dao
com.neuedu.module.servie
3)把上个工程建的dao,service拷贝过来
4)新建包com.neuedu.config
5)在com.neuedu.config包下新建ModuleConfig.java
package com.neuedu.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//@Configuration表示该文件为配置文件
//@ComponentScan表示扫描哪些包下的注解
@Configuration
@ComponentScan(basePackages={"com.neuedu.module"})
public class ModuleConfig {
}
6)在dao类上加注解@Repository("userDao") 表明我是仓储类
@Repository("userDao")
public class UserDaoImpl implements IUserDao {
@Override
public int login(String username, String pwd) {
System.out.println(username+"登录"+"密码为:"+pwd);
return 0;
}
}
7)service类上加注解@Servcie("userService") 表明我是业务类
把userDao自动注入用@Autowired
完整代码:
package com.neuedu.module.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.neuedu.module.dao.IUserDao;
@Service("userService")
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
@Override
public int login(String username, String pwd) {
return userDao.login(username, pwd);
}
public IUserDao getUserDao() {
return userDao;
}
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
}
8)写测试类
package com.neuedu.spring_java;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.neuedu.config.ModuleConfig;
import com.neuedu.module.service.IUserService;
public class SpringJTest {
@Test
public void test1(){
//加载配置文件 (AnnotationConfigApplicationContext注解配置文件方式)
ApplicationContext ctx=new AnnotationConfigApplicationContext(ModuleConfig.class);
//读取bean
IUserService service=(IUserService) ctx.getBean("userService");
//调用bean里的方法
service.login("陈昊", "123456");
}
}