一、项目搭建

1、项目创建

eclipse→project explorer→new→Project→Maven Project

默认配置即可创建项目

2、spring配置

        <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>

3、配置项目编译目标版本

    <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

在项目上右键→maven→update project即可

二、基于注解的开发bean,Bean创建和装配

1、增加配置类,创建Bean

方法一、创建bean

增加注解@Configuration、@Bean、@Scope

@Configuration
public class MyConfig {
@Bean(name="myBean")
@Scope("prototype")
public MyBean createMyBean() {
return new MyBean();
}
}

方法二、使用FactoryBean创建,lambda方式

public class RunnableFactoryBean implements FactoryBean<Runnable>{

    @Override
public Runnable getObject() throws Exception {
return ()->{};
} @Override
public Class<?> getObjectType() {
return Runnable.class;
} @Override
public boolean isSingleton() {
return true;
}
}

如定义一个Jeep,讲工厂类改成

public class RunnableFactoryBean implements FactoryBean<Jeep>{

    @Override
public Jeep getObject() throws Exception {
return new Jeep();
} @Override
public Class<?> getObjectType() {
return Jeep.class;
} @Override
public boolean isSingleton() {
return true;
}
}

使用即可。

方法三、需要参数,默认会获取,自动注入

创建class Car

创建一个工厂

public class CarFactory {
public Car create() {
return new Car();
}
}

在Config中添加

    @Bean
public CarFactory createCarFactory() {
return new CarFactory();
} @Bean
public Car createCar(CarFactory factory) {
return factory.create();
}

使用即可:System.out.println(annotationConfigApplicationContext.getBean(Car.class));//名称获取

2、在方法入口增加配置

方法一、配置一个或多个指定的类型

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MyConfig.class);

方法二、配置指定扫描的包

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.lhx.spring.spring");

方法三、配置指定包,并且排除

@ComponentScan(basePackages="com.lhx.spring.spring",excludeFilters=@Filter(type=FilterType.ASSIGNABLE_TYPE))

FilterType有五种类型

ANNOTATION、ASSIGNABLE_TYPE、ASPECTJ、REGEX、CUSTOM

使用

建一个Dog类

public class Dog {
public void init() {
System.out.println("--------init------");
} public void destory() {
System.out.println("--------destory------");
}
}

增加一个DogConfig配置类

@Configuration
public class DogConfig { @Bean(initMethod = "init", destroyMethod = "destory")
public Dog createDog() {
return new Dog();
}
}

增加一个扫描配置类

@ComponentScan(basePackages="com.lhx.spring.spring",excludeFilters=@Filter(type=FilterType.ASSIGNABLE_TYPE,classes=DogConfig.class))
@Configuration
public class AnnotationScan { }

  当然也可以直接指定有注解的类类型,如UserController.class

使用

public class AnnotationClient2 {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnotationScan.class);
System.out.println(context.getBean(Car.class));
System.out.println(context.getBean(Cat.class));
System.out.println(context.getBean(Dog.class));
System.out.println(context.getBean(Animal.class));
System.out.println(context.getBean(User.class));
context.close();
} }

3、获取Bean

3.1、根据类型获取

System.out.println(annotationConfigApplicationContext.getBean(MyBean.class));

3.2、根据名称获取

System.out.println(annotationConfigApplicationContext.getBean("createMyBean"));//默认是方法名

注意:默认是1中配置的方法名

也可以再注解Bean中指定:@Bean(name="myBean"),指定后默认方法名不能使用

System.out.println(annotationConfigApplicationContext.getBean("myBean"));// 指定具体名

其中:默认是单例,@Scope("prototype")  非单例了

如1,方法二、展示

    System.out.println(annotationConfigApplicationContext.getBean(Jeep.class));
System.out.println(annotationConfigApplicationContext.getBean("createRunnableFactoryBean"));

这个是具体的bean,如何获取工程bean

    System.out.println(annotationConfigApplicationContext.getBean(RunnableFactoryBean.class));//类型获取
System.out.println(annotationConfigApplicationContext.getBean("&createRunnableFactoryBean"));//名称获取

&能获取原因:AnnotationConfigApplicationContext→GenericApplicationContext→AbstractApplicationContext→

ConfigurableApplicationContext→ApplicationContext→ListableBeanFactory→BeanFactory

三、基于注解的开发bean,Bean初始化销毁

1、初始化实现InitializingBean,销毁实现DisposableBean

public class Cat  implements InitializingBean,DisposableBean{

    @Override
public void afterPropertiesSet() throws Exception {
System.out.println("----------afterPropertiesSet--------");
} @Override
public void destroy() throws Exception {
System.out.println("----------destroy--------");
}
}

2、注入时候实现,

在类中顶一个init,destory,在Config配置中@Bean配置;

    @Bean(initMethod="init",destroyMethod="destory")
public Dog createDog() {
return new Dog();
}

3、使用java中,jsr250提供的注解,@PostConstruct,@PreDestroy

public class Animal {
@PostConstruct
public void initial() {
System.out.println("--------initial------");
} @PreDestroy
public void close() {
System.out.println("--------close------");
}
}

四、Bean装配,注解

1、使用@Component注解,没有明确角色

在class 上增加@Component注解,在AnnotationConfigApplicationContext,参数中添加即可。

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
MyConfig.class,User.class);

使用即可。注意:没法绑定初始化方法等。

        System.out.println(annotationConfigApplicationContext.getBean(User.class));
System.out.println(annotationConfigApplicationContext.getBean("user"));

可以通过getBeansOfType获取类型Map

System.out.println(annotationConfigApplicationContext.getBeansOfType(User.class));

{user=com.lhx.spring.spring.User@5e57643e}

如果在通过Config注入,那么获取时候不能使用类型获取了,有多个不知道创建那个,可以使用名称获取

2、可以使用其他注解

@Repository 一般用在数据访问层

@Service 一般用在Service层

@Controller 一般用在控制层

五、Bean依赖注入

5.1、Spring方式,@Autowired

    @Autowired
private UserDao userDao;

如果有多个

1、名称方式,可以使用getBeansOfType获取名称,然后指定名称注入

    @Autowired
@Qualifier("userDao")
private UserDao userDao;

2、在其中某个增加@Primary,默认就会找这个。

5.2、jsr 250 方式,@Resource

5.3、jsr 330方式,@Inject

<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>

代码地址:https://github.com/bjlhx15/spring-boot.git

002-Spring4 快速入门-项目搭建、基于注解的开发bean,Bean创建和装配、基于注解的开发bean,Bean初始化销毁、Bean装配,注解、Bean依赖注入的更多相关文章

  1. 004-Spring boot 快速入门-项目搭建与启动、SpringBootApplication、启动图标

    一.官方地址 Spring:http://spring.io/ Spring Project:http://spring.io/projects Spring boot:https://project ...

  2. 基于renren-fast的快速入门项目实战(实现报表增删改查)

    基于renren-fast的快速入门项目实战(实现报表增删改查) 说明:renren-fast是一个开源的基于springboot的前后端分离手脚架,当前版本是3.0 官方开发文档需付费,对于新手而言 ...

  3. Spring4 快速入门

    Spring4 快速入门 1 Spring简介 1.1 Spring是什么? Spring 是一个 IOC 和 AOP 容器的开源框架,为简化企业级应用而生. IOC(Inversion of Con ...

  4. 架构师入门:搭建双注册中心的高可用Eureka架构(基于项目实战)

    本文的案例是基于 架构师入门:搭建基本的Eureka架构(从项目里抽取) 改写的. 在上文里,我们演示Eureka客户端调用服务的整个流程,在这部分里我们将在架构上有所改进.大家可以想象下,在上文里案 ...

  5. ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例

    前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...

  6. Activiti快速入门项目-kft-activiti-demo

    1.项目简介 1.1 项目信息 本项目旨在让Activiti初学者可以快速入门,使用工作流里面的请假流程作为Activiti企业实战的Hello World. 简单通过这个实例说明如何结合流程与业务, ...

  7. SPRING-BOOT系列之Spring4快速入门

    上节 : spring boot简介 接着上章节的spring boot简介,我们会发现boot是基于spring的,其中最重要的就是spring容器了.那么本章着重介绍spring容器装配自定义be ...

  8. eslint 入门项目搭建过程

    github 地址 : https://github.com/gebin/eslint-demo 运行该项目 npm install npm start 访问 http://localhost:900 ...

  9. Vue -cli 入门 --项目搭建(一)

    一. 安装node.js环境. 在node.js官网下载稳定版本(https://nodejs.org/en/) 下载完成后点击安装,安装过程很简单,一直next即可,安装完成会自动添加node及np ...

随机推荐

  1. HDU 5266 pog loves szh III ( LCA + SegTree||RMQ )

    pog loves szh III Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Oth ...

  2. 分布式事务中的2PC和3PC

    分布式事务 分布式事务是指会涉及到操作多个数据库的事务.其实就是将对同一库事务的概念扩大到了对多个库的事务. 分布式事务中需要注意的是分布式系统中存在的一致性问题: CAP原则:在一个分布式系统中,C ...

  3. htm、html、shtml区别。(web服务器配置ssi)

    转载源:http://www.divcss5.com/html/h59.shtml 首先htm.html.shtml都是静态网页的后缀,三者也可以说都是只是扩展名不同,其他一样,都是静态的网页.Htm ...

  4. JS 的 Browser对象

    Window对象 closed innerHeight    窗口文档显示区的高度,包括滚动条 outerHeight    窗口总高度,包括工具条和滚动条 open() close() alert( ...

  5. vue.js-vuex深入浅出

    1:正确的创建目录 2:action.js 异步请求数据 3:index.js 文件声名 4:mutation.js 同步事务 修改state中的值 5:state.js 申明和保存变量或对象 6:如 ...

  6. Show Profile

    1.是什么:是mysql提供可以用来分析当前会话中语句执行的资源消耗情况.可以用于SQL的调优的测量 2.官网:http://dev.mysql.com/doc/refman/5.7/en/show- ...

  7. Java基础学习(2)

    Java基础学习(二) 面向对象 对象:客观存在的事物 面向对象:人具体关注的事物的某些信息 类:是模子,确定对象会拥有的特征(属性)和行为(方法) 对象的属性:对象具有的各种特征 对象的方法:对象能 ...

  8. 牛客练习赛49 E 筱玛爱游戏 (线性基+博弈)

    链接:https://ac.nowcoder.com/acm/contest/946/E 来源:牛客网 筱玛爱游戏 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...

  9. Ubuntu 16.04 安装摄像头驱动usb_cam

    !!需要在ROS平台上安装   ROS见 https://www.cnblogs.com/haijian/p/8782560.html cd ~/catkin_ws/src 下载usb_cam包 gi ...

  10. DDD领域驱动设计初探(三):仓储Repository(下)

    前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...