Spring中提供了4种注解:
上面四个注解功能是一样的,都可以用来创建 bean 实例,名字不同是为了开发时便于逻辑区分
引入以下jar包:

引入context命名空间

在xml文件中开启注解扫描:
<!-- 有多个包需要开启注解扫描时,可以中间使用逗号分割-->
<context:component-scan base-package="cn.edu.xd.dao,cn.edu.xd.bean"/>
细化扫描方式1:
<context:component-scan base-package="cn.edu.xd" use-default-
filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
表示只扫描cn.edu.xd包下面的类中的@Controller注解
细化扫描方式2:
<context:component-scan base-package="cn.edu.xd" use-default-
filters="false">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
表示不扫描cn.edu.xd包下面的类中的@Controller注解,其他注解都扫描
package cn.edu.xd.dao;
import org.springframework.stereotype.Repository;
@Repository(value = "userDao")
public class UserDao {
public void add(){
System.out.println("UserDao add...");
}
}
@Test
public void test1(){
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//加载文件
UserDao userDao=context.getBean("userDao",UserDao.class);
userDao.add();
}
1. @Autowired:根据属性类型进行自动装配
package cn.edu.xd.dao;
import org.springframework.stereotype.Repository;
@Repository(value = "userDao")
public class UserDao {
public void add(){
System.out.println("UserDao add...");
}
}
package cn.edu.xd.service;
import cn.edu.xd.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service(value = "userService") // <bean id="userService" class="..."/>
//value值如果省略 默认是类名首字母小写 比如类型AAAA value默认值就说aAAA
public class UserService {
@Autowired
UserDao userDao;
//不需要set方法
// public void setUserDao(UserDao userDao) {
// this.userDao = userDao;
// }
public void add(){
System.out.println("UserService add...");
userDao.add();
}
}
@Test
public void test1(){
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//加载文件
UserService userService=context.getBean("userService",UserService.class);
userService.add();
}

2. @Qualifier:根据名称进行注入
@Qualifier 注解的使用,和上面@Autowired 一起使用
@Autowired 是根据类型进行匹配,当有多个类型匹配时,就需要根据@Qualifier确定是哪一个实例bean
package cn.edu.xd.dao;
public interface UserDao {
public void add();
}
package cn.edu.xd.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl1 implements UserDao {
@Override
public void add() {
System.out.println("UserDaoImpl1 add...");
}
}
package cn.edu.xd.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl2 implements UserDao {
@Override
public void add() {
System.out.println("UserDaoImpl2 add...");
}
}
package cn.edu.xd.service;
import cn.edu.xd.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service(value = "userService") // <bean id="userService" class="..."/>
//value值如果省略 默认是类名首字母小写 比如类型AAAA value默认值就说aAAA
public class UserService {
@Autowired
UserDao userDao;
//不需要set方法
// public void setUserDao(UserDao userDao) {
// this.userDao = userDao;
// }
public void add(){
System.out.println("UserService add...");
userDao.add();
}
}
此时如果 UserService类中不加@Qualifier 注解,就会报错,因为UserDao类型的bean有两个
@Autowired
@Qualifier(value = "userDaoImpl1")
UserDao userDao;

@Autowired
@Qualifier(value = "userDaoImpl2")
UserDao userDao;

3. @Resource:可以根据类型注入,可以根据名称注入
//根据类型注入
@Resource
UserDao userDao;
//根据名称注入
@Resource(name="userDaoImpl1)
UserDao userDao;
4. @Value:注入普通类型属性
@Component
public class User {
@Value("tom")
String name;
@Value("18")
int age;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
不使用xml配置文件,前面开启注解扫描还需要在xml文件中配置
创建一个配置类:
@Configuration //表示是配置类 相当于bean.xml
@ComponentScan(basePackages = {"cn.edu.xd"}) //表示对哪些包进行扫描
public class SpringConfig {
}
@Test
public void test1(){
ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);//加载文件
User user=context.getBean("user",User.class);
System.out.println(user);
}
test方法中加载的是SpringConfig这个配置类,不再是之前的bean.xml文件