spring-02_3

有问题可以留言我,虽然我也很菜

注解注入

注解: 就是一个类,使用格式: @注解名称,开发中常常使用注解替代xml文件.

注意:

  • Spring默认情况下,注解是不生效的,我们需要手动开启注解功能.

  • 使用注解给对象赋值不需要set方法,但是xml配置对象属性的话,对应属性必须要有set方法.

  • 如何开启spring的注解功能呢?

  • 在xml中配置修改内容如下图:

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,直接放代码:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值