有问题可以留言我,虽然我也很菜
注解注入
注解: 就是一个类,使用格式:
@注解名称
,开发中常常使用注解替代xml文件.注意:
Spring默认情况下,注解是不生效的,我们需要手动开启注解功能.
使用注解给对象赋值不需要set方法,但是xml配置对象属性的话,对应属性必须要有set方法.
如何开启spring的注解功能呢?
- 在xml中配置修改内容如下图:
- 开启了注解之后,我们使用注解,是在要声明的对象所在的类,比如我要创建user对象,我就应该在User类里声明注解,不是在测试类中.
Component注解的使用
@Component
用于取代<bean class=''>
.
@Component(id)
用于取代<bean id='' class=''>
.案例:
1. beans.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!--suppress ALL -->
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解-->
<context:annotation-config>
</context:annotation-config>
<!--设置注解的位置,设置之后该包下面的所有注解spring都会扫描-->
<context:component-scan base-package="service">
</context:component-scan>
</beans>
2. User接口实现类UserImpl
@Component("user")
public class UserImpl implements User {
private String name;
public UserImpl(){
System.out.println("初始化userimpl");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void add() {
System.out.println("UserImpl实现自User接口");
}
@Override
public void add(User user) {
System.out.println("添加用户!" + user);
}
}
3. 测试类:
/**
* 注解案例1: `@Component`用于取代`<bean class=''>`.
* 在UserImpl类中写了`@Component`注解后
* 相当于配置了<bean class="service.impls.UserImpl"></bean>
*
* @Test 这个注解是用于单元测试的,就是不用main函数也可以运行
* 对于这个注解有几个注意的点:
* 1.这个注解所在的方法必须是public
* 2.这个注解所在的方法不能是static
*/
public class Test10 {
@Test
public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans10.xml");
/**
* 如果`@Component`没有配置id
* 那我们可以通过class类型获取bean对象,方法不变,参数类型变了而已
* 其中参数可以为接口类型,也可以为接口的实现类类型
* 如果参数声明的是接口类型,会自动转变为子实现类类型
*/
User user = context.getBean(User.class);
System.out.println(user.getClass());//class service.impls.UserImpl
user.add();
//如果`@Component`配置了id,就跟以前一样就好了
//UserImpl user = (UserImpl) context.getBean("user");
}
}
- web开发中,spring提供了3个
@Component
注解的衍生注解(功能一样的)来取代<bean class=''>
,分别是:
@Repository(“名称”): dao层(数据访问层)
@Service(“名称”): service层(业务逻辑层)
@Controller(“名称”): web层(界面层)
- 这里有一个问题:为什么不都用@Component注解来实现三层架构呢?
其实是因为这样子,因为三层架构中,我们在web需要创建service层的对象,在service层需要创建dao层的对象
如果都用component注解,可能会出现如果web层对象最先创建,然后web层是最先调用方法的,这时候service对象不存在,就会报错,我们用那三个衍生注解后,它会自动先创建dao的对象,然后service的对象,最后再web层对象,这样就不会出现这种问题,不懂可以看我下面我自己写的例子,也可以看看我给的视频再看我写的例子
- 还有一些常用注解:
Autowired: 自动根据类型(也就是类名/接口名.class生成的Class对象,接口名.class生成的是其实现类的对象)注入
Qualifier(“名称”): 根据指定的名称自动找到对应的bean对象然后注入给属性(一般不用,用上面的那一个让系统自动注入挺好)
Resource(name=“名称”): 等于上面两个的作用合起来,用的也不多.
PostConstruct: 自定义初始化,相当于xml文件中配置
<bean init-method="">
PreDestroy: 自定义销毁,相当于xml文件中配置
<bean destroy-method="">
Scope(“prototype/singleton”): 设置该对类是单例还是多例模式,这个注解直接写在其它注解的下一行就可以了,不冲突.
- 例1–不使用注解模拟三层架构web->service->dao,东西有点多,我就直接放代码吧:
- 例2–使用注解模拟三层架构web->service->dao,直接放代码:
- 模拟三层架构视频讲解:链接: https://pan.baidu.com/s/1alOFci0QZGCoxfcneKLd9Q 提取码: iwd4.