Spring 使用注解进行 Bean 管理 | Spring学习笔记2.0

2022-09-27 19:49:57 浏览数 (1)

Spring 的 bean 管理 (注解)

注解介绍

  1. 代码中的特殊标识,使用注解可以完成功能
  2. 注解写法 @注解名称 (属性名称=属性值)
  3. 注解可以使用在类上边,方法上班和属性上边

Spring 注解开发准备

导入 jar 包

  • 导入基本的 jar 包
  • 导入 aop 的 jar 包

创建类与方法

在src下创建一个 club.teenshare.bean 的包,并再创建一个 User 的类

代码语言:javascript复制
package club.teenshare.bean;

public class User {
    private String name;
    public void say(){
        System.out.println("I said my name is:");
    }
}

创建 spring 配置文件,引入约束

代码语言:javascript复制
<?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: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-4.1.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 开启注解扫描
        1. 到包所包含的类中进行扫描类,方法,属性上是否有注解存在
    -->
    <context:component-scan base-package="club.teenshare"></context:component-scan>

    <!-- 
        只会扫描属性上面的注解
    -->
    <!-- <context:annotation-config></context:annotation-config> -->

</beans>

其中 xmlns:context="http://www.springframework.org/schema/context" 以及 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"十分重要;用于引入注解的约束

开启注解扫描有两种方法:

代码语言:javascript复制
<!-- 开启注解扫描
    1. 到包所包含的类中进行扫描类,方法,属性上是否有注解存在
-->
<context:component-scan base-package="cn.itcast"></context:component-scan>

以及

代码语言:javascript复制
<!-- 
    只会扫描属性上面的注解
-->
<context:annotation-config></context:annotation-config>

我们通常采用第一种方式开启扫描

  • 第一天做 ioc 的基本功能,引入约束 beans
  • 做 spring 开发还需要引入新的约束 context 约束

注解创建对象

在创建对象的类上面使用注解实现

代码语言:javascript复制
@Service(value="user")   // 相当于<bean id="user" class=".."></bean>
public class User {

进行测试注解的创建:

代码语言:javascript复制
@Test
public void test(){
    ApplicationContext context = 
            new ClassPathXmlApplicationContext("applicationContext.xml");
    User user = (User)context.getBean("user");
    user.say();
}

Spring的bean管理中常用的注解

创建对象的注解有四个:

  1. @Component:作用在类上
  2. @Repository:用于对DAO实现类进行标注(持久层)。
  3. @Service:用于对Service实现类进行标注(业务层)。
  4. @Controller:用于对Controller实现类进行标注(WEB层)。

后三个注解是Spring中提供的@Component的三个衍生注解(功能目前来讲是一样的),它们是为了让标注类本身的用途更清晰,Spring在后续的版本中会对其进行增强。

bean的作用范围的注解

@Scope

  1. singleton:单例,默认值
  2. prototype:多例
代码语言:javascript复制
@Service(value="user")   // 相当于<bean id="user" class=".."></bean>
@Scope(value="prototype")
public class User {

注解注入属性(对象)

创建 service 类,创建 dao 类,在 service 中得到 dao 对象

代码语言:javascript复制
@Service(value="userService")
public class UserService {
代码语言:javascript复制
@Component(value="userDao")
public class UserDao {
代码语言:javascript复制
@Service(value="userService")
public class UserService {

    // 创建 dao 属性
    // 在 userDao 上使用注解完成对象注入
    @Autowired
    private UserDao userDao;
    // 使用注解方式不需要写 set 方法

    public void say(){
        System.out.println("In Service....");
        userDao.say();
    }
}

注意:使用注解@Autowired,它不是根据名字去找Dao,而是默认按类型进行装配

代码语言:javascript复制
@Service(value="userService")
public class UserService {

    // name 属性为 UserDao 的 value 属性
    @Resource(name="userDao")
    private UserDao userDao;
    public void say(){
        System.out.println("In Service....");
        userDao.say();
    }
}
  • 另外一种注解是@Resource,使用@Resource注解,它默认是按名称进行注入的,也就是它的 name 属性需要同装载类的 value 一致。在实际开发中,因为 @Resoure更为准确,我们更多使用@Resource注解来注入属性的,注解@Autowired用到的并不多。
  • 在 service 类中定义一个 dao 的属性;并加上注解 @Autowired
  • 创建 service 和 dao 对象

配置文件和注解混合使用

  1. 创建对象操作使用配置文件方式实现
  2. 注入属性的操作使用注解方式实现

例子:

创建 BookService, OrderDao, BookDao 三个类;想要在 BookService 类中获得另外两个类的对象。

通过配置文件,进行类的实例的注入:我们在这里新建另一个名为applicationContext2.xml;同样由于我们和注解一同使用,我们也要引入并开启注解扫描。

代码语言:javascript复制
<?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: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-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

 <!-- 开启注解扫描
  1. 到包所包含的类中进行扫描类,方法,属性上是否有注解存在
  -->
  <context:component-scan base-package="club.teenshare"></context:component-scan>
  
  <!-- 配置对象  -->
  <bean id="bookService" class="club.teenshare.service.BookService"></bean>
  <bean id="bookDao" class="club.teenshare.service.BookDao"></bean>
  <bean id="orderDao" class="club.teenshare.service.OrderDao"></bean>
</beans>

然后,我们在 BookService.java 类中进行注解定义:

代码语言:javascript复制
public class BookService {
 //得到 BookDao 以及 OrderDao 的对象
 @Resource(name="bookDao")
 private BookDao bookDao;
 
 @Resource(name="orderDao")
 private OrderDao orderDao;
 
 public void add(){
  System.out.println("service........");
  bookDao.book();
  orderDao.buy();
 }
}

注意:这里 @Resoure(name="?") 中的 name 的值需要同配置文件中的 id 名称一致

另外两个 java 类文件则无需在修改,他们已经在 xml 文件中完成了配置。然后我们就可以通过 ApplicationContext 进行使用了。

代码语言:javascript复制
@Test
public void test(){
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext2.xml");
    BookService bookService = (BookService)context.getBean("bookService");
    bookService.add();
}

0 人点赞