1. 注解概念
- 注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值…)
- 使用注解,注解作用在类上面,方法上面,属性上面
- 使用注解目的:简化 xml 配置
Spring中提供了4种注解:
- @Component: 组件bean
- @Service: 服务层bean
- @Controller: 控制器bean
- @Repository: 数据访问层bean
上面四个注解功能是一样的,都可以用来创建 bean 实例,名字不同是为了开发时便于逻辑区分
2. 代码示例
引入以下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();
}
3. 注解方式实现属性注入
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")
public class UserService {
@Autowired
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")
public class UserService {
@Autowired
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 +
'}';
}
}
4. 纯注解开发
不使用xml配置文件,前面开启注解扫描还需要在xml文件中配置
创建一个配置类:
@Configuration
@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文件
|