使用注解开发Spring

【注意】:在spring4之后,想要使用注解形式,必须得要引入aop的包

image-20210120153838106

还需要在配置文件中引入context依赖

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:comtext="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 
       https://www.springframework.org/schema/context/spring-context.xsd">

    <comtext:annotation-config/>
</beans>

9.1、Bean的实现

我们之前都是使用 bean 的标签进行bean注入,但是实际开发中,我们一般都会使用注解

  • 给类添加@Component注解后,这个类就交给了Spring管理,相当于一个Bean

等价于配置文件的:

<bean id="user" class="com.jh.domain.User"/>
  • 不添加参数时,Bean的id为这个类的类名首字母小写。

  • 添加value属性后,id为value的值。

具体实现步骤

  1. 在applicationContext.xml中配注解扫描

    <!-- 指定要扫描的包,这个包下的所有注解都会生效 -->
    <context:component-scan base-package="com.jh.domain"/>
    
  2. 编写实体类,添加@Component注解

    @Component(value = "user")
    public class User {
        private String name;
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    '}';
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
  3. 测试结果,输出user,说明注解使用成功!

    @Test
    public void test01() throws Exception{
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = context.getBean("user", User.class);
        System.out.println(user);
    }
    

9.2、属性的注入

我们也可以使用@Value注解为Bean注入属性

使用@Value注解,它的参数就是您需要注入的值。

它等价于xml的:

<property name="name" value="姓名"/>

具体实现

  1. 为实体类的属性添加@Value注解

    @Component
    public class User {
        @Value("姓名")
        private String name;
        // 使用@Value注解的属性,不需要添加set方法
    }
    
  2. 如果属性有set方法,也可以将@Value注解添加在其上面

    @Component
    public class User {
        private String name;
    
        @Value("姓名")
        public void setName(String name) {
            this.name = name;
        }
    }	
    

9.3、衍生的注解

@Component有几个衍生注解,我们在web开发中,会按照MVC三层架构分层!

为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。

  • @Controller:【web层】

    import org.springframework.stereotype.Controller;
    
    @Controller
    public class UserController {
    }
    
  • @Service:【service层】

    import org.springframework.stereotype.Service;
    
    @Service
    public class UserServiceImpl implements UserService {
    }
    
  • @Repository:【dao层】

    import org.springframework.stereotype.Service;
    
    @Repository
    public class UserDaoImpl implements UserDao {
    }
    

@Component和这个三个衍生注解的功能都是一样的,都代表将其交给Spring管理,是一个Bean

【注意】要使用这个几个注解,必须现在spring配置文件了设置注解扫描

我们可以设置扫描器扫描它们的上一级包,这样就可以实现扫描所有注解

image-20210120163538852

<context:component-scan base-package="com.jh"/>

使用com.jh包就可以扫描其下面所有的子包

9.4、自动装配的注解

在自动装配时已经提到过了,自动装配的注解

  • @Autowired:使用byType方式注入
  • @Autowired配合@Qualifier可以实现先byType,再byName
  • @Resource注解:先byName,再byType

详情请见:https://www.cnblogs.com/paidaxing0623/p/14312223.html

9.5、作用域

我们可以用过@Scope注解指定Bean的作用域

使用@Scope注解可以设定以下值

  • @Scope,相当于@Scope("singleton")【单例模式;默认】
  • @Scope("prototype")【原型模式】
  • @Scope("request")
  • @Scope("session")
  • 等等……

一般开发中常用的是singleton和prototype两种

它相当于xml中的

image-20210120170019978

具体实现

@Component
@Scope
public class User {
    private String name;

    @Value("姓名")
    public void setName(String name) {
        this.name = name;
    }
}

9.6、小结

XML与注解的比较

  • XML方式适用于任何场景,结构清晰,维护方便!
  • 注解只能特定的类使用,维护相对复杂,但是开发简单方便!

XML与注解整合开发:推荐最佳实践

  • XML用来管理Bean
  • 注解只负责完成属性的注入
  • 使用过程中,注意要使用注解,必须开启注解的扫描
<!-- 自动装配时使用 -->
<context:annotation-config/>
<!-- 指定要扫描的包,这个包下的所有注解都会生效 -->
<context:component-scan base-package="com.jh"/>

作用:

  • 进行注解驱动注册,从而使注解生效
  • 用于激活那些已经在spring容器里注册过的bean上面的注解,也就是显示的向Spring注册
  • 如果不扫描包,就需要手动配置bean
  • 如果不加注解驱动,则注入的值为null!
posted @ 2021-01-22 11:19  天下御免  阅读(112)  评论(0编辑  收藏  举报