当前位置: 首页 > article >正文

spring 学习路线梳理(二)注解

1.通过注解的方式创建bean
  1.1 定义dao层的接口和实现
public interface ILoginDao {
    public String login();
}


@Slf4j
@Repository
public class LoginDaoImpl implements ILoginDao {

    public LoginDaoImpl(){
        System.out.println("spring create bean call");
    }


    @Override
    public String login() {
        log.info("{}","login validator send  dao");
        return "login success !!!";
    }
}
1.2 定义service层的接口和实现
public interface ILoginService {
    public String login();
}


@Slf4j
@Service("loginService")
public class LoginServiceImpl implements ILoginService , InitializingBean, DisposableBean {

    public ILoginDao iLoginDao;


//    //通过set方法 注入 需要的dao
//    public void setiLoginDao(ILoginDao iLoginDao) {
//        this.iLoginDao = iLoginDao;
//    }
//    构造器注入
    LoginServiceImpl(ILoginDao iLoginDao){
        this.iLoginDao = iLoginDao;
    }

    @Override
    public String login() {
        log.info("{}","login validator send service");
        iLoginDao.login();
        return "login success !!!";
    }

    //销毁之前的操作
    @Override
    public void destroy() throws Exception {
        System.out.println("destroy");
    }

    //初始化之前的操作
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet");
    }
}

@Component  组件注解 下面又有3个衍生注解

    定义dao的是 @Repository 

    定义service的是  @Service("loginService")  // 可以指定value,如果没有指定需要按照类型从容器中取bean

   定义controller的是 @Controller

1.3 在xml文件中配置需要扫描的包

引入扫描的 空间 context ,定义扫描的包

1.4 获取容器,从容器中拿到需要的bean
public class SpringSecurityDemoApplication {

    public static void main(String[] args) {
        //SpringApplication.run(SpringSecurityDemoApplication.class, args);

        ClassPathXmlApplicationContext xct
                = new ClassPathXmlApplicationContext("applicationContext.xml");

        ILoginService bean = (ILoginService) xct.getBean("loginService");

        String login = bean.login();
        System.out.println(login);

        xct.close();
    }

}

如果没有在注解中指定别名,获取bean的时候会报错。需要通过类型获取bean

service注解中指定的别名注释掉

获取bean的时候按照别名获取

下面是报的错误

通过类型获取 (正常)

2.从spring 3.0开始纯注解开发,没有xml配置

将xml中的配置全部用注解的方式替换

2.1定义一个配置类
@Configuration //定义注解的配置类
@ComponentScan("com.drawing") //定义需要扫描的包
public class SpringConfig {
}
2.2 将获取容器的实现类换成通过注解的方式获取

2.3 运行正常

创建bean的方式没有变化,通过构造方式创建

2.4通过注解方式处理初始化之前的操作和销毁之前的操作

2.4 需要按照单利或多例创建类,只需要在类上加入 
@Scope("prototype") 注解指定就可以

3.自动注入需要的bean

@Slf4j
@Service
public class LoginServiceImpl implements ILoginService {

    //@Autowired
    public ILoginDao iLoginDao;


//    //通过set方法 注入 需要的dao
//    public void setiLoginDao(ILoginDao iLoginDao) {
//        this.iLoginDao = iLoginDao;
//    }
//    构造器注入
    LoginServiceImpl(ILoginDao iLoginDao){
        this.iLoginDao = iLoginDao;
    }

    @Override
    public String login() {
        log.info("{}","login validator send service");
        iLoginDao.login();
        return "login success !!!";
    }
}

  留下构造器,将@Autowired注释掉可以正常运行

   将构造器和@Autowired同时注释掉,只留下 set方法 提示空指针异常,dao没有注入

   将 @Autowired  留下 构造器注释掉 是可以正常注入成功。

总结:可以通过构造器注入或者 @Autowired 加set方法注入(简写只留下@Autowired不写set方法也可以)。

4.有多个实现类的方式

4.1 定义多个dao的接口和实现
public interface ILoginDao {
    public String login();
}

实现 类 1
@Slf4j
@Repository("ILoginDao1")
public class LoginDaoImpl implements ILoginDao {

    public LoginDaoImpl(){
        System.out.println("spring create bean call");
    }


    @Override
    public String login() {
        log.info("{}","login validator send  dao 1");
        return "login success !!!";
    }
}

实现 类 2

@Slf4j
@Repository("ILoginDao2")
public class LoginDaoImpl2 implements ILoginDao {

    public LoginDaoImpl2(){
        System.out.println("spring create bean call");
    }

    @Override
    public String login() {
        log.info("{}","login validator send  dao 2");
        return "login success !!!";
    }
}
4.2 service中的注入 编译报错

4.3 定义多个dao层的实现执行报错,提示不是唯一的

   

4.4 解决

 在service注入中加入 @Qualifier 指定注入bean的名称

5.注解管理第三方的bean

定义bean

在spring的配置文件中导入bean,就是添加到容器中。剩下就是注入使用。


http://www.kler.cn/a/377934.html

相关文章:

  • H265编码丢帧问题分析
  • 使用 Elasticsearch 进行语义搜索
  • 通过不当变更导致 PostgreSQL 翻车的案例分析与防范
  • 第十二章 spring Boot+shiro权限管理
  • 相机硬触发
  • 使用onnxruntime c++ API实现yolov5m视频检测
  • 搜维尔科技:数据手套|动作捕捉|模拟仿真|VR交互解决方案
  • Unity3D UI 拖拽
  • 可商用的免费字体阿里巴巴普惠字体
  • ubuntu搭建Vlmcsd记录
  • Qt项目实战:语言家(中英文翻译)
  • 分布式架构搭建博客网站
  • MindShare PCIE 3.0 笔记-第三四章
  • Spring Boot技术:校园社团信息管理的革新者
  • 小柴带你学AutoSar系列三、标准和规范篇(4)RTE
  • C语言另一种编码方式开发状态机(无switch)
  • MySQL有关基础查询的知识点
  • Fetch 请求不支持取消操作的问题及解决方案
  • GaussDB和Oracle的语法对比
  • 使用RabbitMQ实现微服务间的异步消息传递
  • Java学习教程,从入门到精通,Java 循环结构:while 和 do...while(17)
  • 2024年 · 地表最强的十大遥感影像分割模型
  • Js内建对象
  • 10个领先的增强现实平台【AR】
  • uniapp 使用uni.getRecorderManager录音,wav格式采样率低于44100,音频播放不了问题解决
  • 无人机敏捷反制技术算法详解!