1、什么是注解
1.注解是代码的特殊标记,格式:@注解名称(属性名=属性值,属性名=属性值)
2.使用注解,可以作用在类上面、方法上面、属性上面
3.使用注解的目的:简化xml配置文件
2、创建Bean对象可以使用的注解
1.@Component
2.@Controller
3.@Repository
4.@Service
上面四个注解的功能都是一样的,都可以用来创建bean对象实例,把这些对象放在IOC容器里
步骤1:创建一个配置类
//替代xml配置文件,表示MyConfig是一个配置类 @Configuration //开启包扫描功能,basePackages表明要扫描哪个包下的类 @ComponentScan(basePackages = "day01.demo1") public class MyConfig { }
步骤2:代码初体验
@Component() //相当于xml配置文件 <bean id = "a"></bean>,可以不写,默认是类名的首字母小写 public class A { public void hello(){ System.out.println("你好呀"); } }
下面来通过spring的方式来获取 A 的对象,并调用其方法hello()
@Test
public void test(){ ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class); A bean = context.getBean("a", A.class); bean.hello(); }
运行结果:
如果 @Component(value = “Hello”)的value属性值改变,context调用getBean()方式时,上述代码的"a"也就应该改为value对应的属性值"Hello",否则就会报下图的错误:
步骤3:代码小进阶
//先创建一个接口UserDao public interface UserDao { void add(); }
//先创建一个接口UserDao public interface UserDao { void add(); }
@Service public class UserService { @Autowired //此注解是根据属性类型进行自动装配 private UserDao userDao; public void fun1(){ System.out.println(userDao); userDao.add(); } }
@Test public void test1(){ ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class); UserService userService = context.getBean("userService", UserService.class); userService.fun1(); }
上述代码执行流程:
从IOC容器中获取类UserService的实例,然后调用其方法fun1();同时,也会从IOC容器中创建类UserDaoImp的实例,然后输出userDao对象,最后userDao调用重写后的方法add()
运行结果:
需要注意的是,因为接口不能实例化,所以不能给UserDao添加注解,而是应该在其实现类上添加创建对象的注解(四个注解中的任何一个即可)
步骤4:把握细节
再创建一个UserDao接口的实现类UserDaoImpl
@Repository //UserDao接口的另一个实现类 public class UserDaoImpl implements UserDao { @Override public void add() { System.out.println("add()..."); } }
需要注意的是,当一个接口有多个实现类的时候,使用@Autowired就会报如下异常:
解决方法1:可以和@Qualifier一起使用
@Service public class UserService { @Autowired @Qualifier(value = "userDaoImpl") //@Qualifier注解根据名称注入,value值是该类的注解中的value值 private UserDao userDao; public void fun1(){ System.out.println(userDao); userDao.add(); } }
解决方法2:使用@Resource注解
@Service public class UserService { @Resource(name = "userDaoImpl1")//此注解相当于@Autowired 和 @Qualifier注解,来自于javax,不建议使用 private UserDao userDao; public void fun1(){ System.out.println(userDao); userDao.add(); } }