五、Spring中基于注解的功能实现

首先我们需要知道这个单词Component
  • Component(value=“userService”)表示以名字为userService将该类加到spring容器当中
  • 直接写Component则默认将该类加入spring容器中,名字是以小写字母开头的类名
  • 还有另外三个@Repository、@Service、@Controller,用法一模一样,只是为了让大家更直观的知道此时是持久层、业务层还是控制层!
所以先来看看service层的实现类
package com.lp.service.impl;

import com.lp.dao.UserDao;
import com.lp.dao.impl.UserDaoImpl;
import com.lp.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

/**
 * Component(value="userService")如果不加值,
 * 直接写Component则默认将该类加入spring容器中,
 * 名字以小写字母开头的类名
 *
 * @Date 2020/5/26 21:21
 * @Author luopeng
 */
@Service
public class UserServiceImpl implements UserService {

   /* @Autowired
    @Qualifier("userDaoImpl")*/
   @Resource(name = "userDaoImpl")
    private UserDao userDao;

    public void saveUser() {
        System.out.println("Annotation测试!");
        userDao.saveUser();
    }
}

上面的代码中你看到了@Autowired 、@Qualifier(“userDaoImpl”)和@Resource(name = “userDaoImpl”)这三个没见过的注解

首先呢@Autowired 代表的是自动注入,这时候我们如果需要把一个接口注入进来你就会用到它,它也很方便,但是,如果你需要注入的接口有着多个实现类,你就不能直接写@Autowired 了,这时候解决方案有多种:

  • 可以将接口改为实现类名
  • 可以将接口后的变量名改成实现类放在容器里面的名称
  • 可以@Autowired配合@Qualifier(“userDaoImpl”)使用,括号里面代表的是注入的类
  • 可以单独使用@Resource(name = “userDaoImpl”),括号里面代表的是注入的类
  • spring基于注解是不支持注入集合类型的,只能通过xml配置注入
  • 对于基本数据类型和String类型需要通过@value注解来进行注入
再看看dao层的实现类
package com.lp.dao.impl;

import com.lp.dao.UserDao;
import org.springframework.stereotype.Repository;

/**
 * @Date 2020/5/26 21:20
 * @Author luopeng
 */
@Repository
public class UserDaoImpl implements UserDao {

    public void saveUser() {
        System.out.println("保存成功!000000000000000");
    }
}

package com.lp.dao.impl;

import com.lp.dao.UserDao;
import org.springframework.stereotype.Repository;

/**
 * @Date 2020/5/26 21:20
 * @Author luopeng
 */
@Repository
public class UserDaoImpl1 implements UserDao {
    
    public void saveUser() {
        System.out.println("保存成功!111111111111111");
    }
}

我们现在只是声明要把类放在容器里面,但还没有放进去,要真正让spring找到这个类我们需要配置扫描包
<?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: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:component-scan base-package="com.lp"/>
</beans>

@Scope,默认单例singleton,里面也可以指明是多例的prototype
至此,配置的方式便可以运行程序了
还有两个个注解了解就行
在方法上面的注解

  • @PreDestory 用于指定销毁方法
  • @PostConstruct 用于指定初始化方法

猜你喜欢

转载自blog.csdn.net/lp20171401131/article/details/106383517
今日推荐