几个核心注解的介绍
1.@Configuration
它的作用是:将一个java类修饰为==配置文件==,在这个java类进行组件注册
1
package com.kkb.config;

import org.springframework.context.annotation.Configuration;

@Configuration//相当于配置文件
public class ApplicationConfig {

}
1
2
3
4
5
6
7
8
public static void main(String[] args) {
//1.获得Spring容器对象

AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(ApplicationConfig.class);

//2.获得在Spring容器已经注册bean对象
String beanNames[]= context.getBeanDefinitionNames();
for(String beanName:beanNames){
System.out.println(beanName);
}

}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
这个时候applicationConfig将被注册到spring容器中,通过new BeanFactory的一个实现类AnnotationConfigApplicationContext传入配置类,获得注册在spring容器中的对象

2.@Bean
介绍:

Spring框架提供的注解
@Bean可以将一个java类交个spring管理
@Bean要在配置类中使用
特征:

在默认时,以@Bean修饰的bean对象对应的关键字是(类名)
如果在@Bean指定的bean对象@Bean(value={“stu1”,“stu2”}),此时bean对象在spring容器中对应的关键字是stu1或者stu2
所用通过@Bean修饰生成的Bean对象默认的情况都是单例的
对于单例的Bean对象,可以通过@Lazy延缓该对象被创建的时机
package com.kkb.beans;
public class Student {
public Student() {
System.out.println("student构造方法被调用了");
}
}

1
2
3
4
5
6
7
package com.kkb.beans;

public class Teacher {
public Teacher(){
System.out.println("teacher 构造方法被调用了");
}
}
1
2
3
4
5
6
7
package com.kkb.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;

import com.kkb.beans.Student;
import com.kkb.beans.Teacher;

@Configuration//相当于配置文件
public class ApplicationConfig {
@Bean(name={"stu1"})
public Student student2(){
return new Student();
}
@Lazy//这个注解专用于单例模式bean对象,此时bean对象不会在
//spring容器启动时被创建的,只有在一个用户来访时才会被创建
@Bean
public Teacher teacher(){
return new Teacher();
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.kkb.test;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.kkb.beans.Student;
import com.kkb.beans.Teacher;
import com.kkb.config.ApplicationConfig;

public class TestMain {

public static void main(String[] args) {
//1.获得Spring容器对象
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(ApplicationConfig.class);
System.out.println("Spring 容器启动了。。。");
Teacher t =(Teacher)context.getBean("teacher");
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
控制台输出的结果为

3.@ComponentScan
介绍
1)Spring框架提供的注解
2)自动将指定包下的类加载到Spring容器中(@Controller,@Service,@Repository,@comp)
3)@ComponentScan要在配置类中使用

特征
1)可以将某些类排除在Spring容器之外
2)可以将某些类添加到Spring容器之内

FilterType:扫描过滤策略
1)ANNOTATION 根据注解进行过滤(@Controller,@Service,@Repository,@Component)
2)ASSIGNABLE_TYPE 根据指定的类型
3)ASPECTJ表达式过滤
4)REGEX根据正则表达式过滤
5)CUSTOM,根据开发人员自行定义过滤规则

自定义扫描过滤规则
在@ComponentScan(value=“包路径”,
excludeFilters={
@Filter(type=FilterType.CUSTOM,
value=自定义过滤规则类.class)
})

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;

import com.kkb.beans.DeptDao;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;

@ComponentScan(value="com.kkb.beans",useDefaultFilters=false,
includeFilters={
@Filter(type=FilterType.ANNOTATION,
value={Controller.class,Service.class}),

@Filter(type=FilterType.ASSIGNABLE_TYPE,
value={DeptDao.class})

})
@Configuration//相当于配置文件
public class ApplicationConfig {

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
4.@ProperySource
@ProperySource的主要作用是代替context:property-placeholder标签。

import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.PropertySource;

@PropertySource(value = { "classpath:/config.properties" })
@ComponentScan(value={"com.kkb.beans"})
@Configuration//相当于配置文件
public class ApplicationConfig {

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.kkb.beans;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Student {
@Value("allen")//使用基本数据为属性赋值
private String sname;
@Value("#{28-2}")//使用SPEL为属性赋值
private int age;
@Value("${student.home}")//读取来自于外部的properties属性文件内容
private String home;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Student [sname=" + sname + ", age=" + age + ", home=" + home + "]";
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
5.@import
**介绍:**负责将没有任何修饰的java类调入到spring容器中。
使用方式:
1)@Import({one.class,two.class})
2)@Import({ImportSelector接口实现类}) 返回需要添加的类的路径
3)@Import({自定义Bean对象注册实现类}),可以直接将类注册到Spring容器中

package com.kkb.util;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

import com.kkb.beans.Teacher;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//1.将Java类注册到Spring
BeanDefinitionBuilder builer = BeanDefinitionBuilder.genericBeanDefinition(Teacher.class);
//2.创建当前Java类的实例对象
BeanDefinition obj= builer.getBeanDefinition();

//3.通过Spring的bean注册器,将当前Java类的实例对象添加到Spring容器
registry.registerBeanDefinition("kkb", obj);

}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.kkb.util;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportSelector implements ImportSelector {

public String[] selectImports(AnnotationMetadata importingClassMetadata) {

String classNames[]={"com.kkb.beans.Student"};
return classNames;
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.kkb.config;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Lazy;

import com.kkb.beans.Student;
import com.kkb.beans.Teacher;
import com.kkb.util.MyFactoryBean;
import com.kkb.util.MyImportBeanDefinitionRegistrar;
import com.kkb.util.MyImportSelector;

//@Import(value = {Student.class,Teacher.class})
@Import(value={MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
@Configuration//相当于配置文件
public class ApplicationConfig {

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
6.@Conditional
spring框架提供的注解
动态决定当前java类是否有资格添加到spring容器
在配置类中使用
package com.kkb.util;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.stereotype.Component;

public class LinuxCondition implements Condition {

public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

String systemName = context.getEnvironment().getProperty("os.name");
if(systemName.contains("Linux")){
return true;
}
return false;
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.kkb.util;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
//自定义一个判断条件
public class WindowsCondition implements Condition {

/*
* ConditionContext context:spring容器上下文环境
* AnnotatedTypeMetadata metadata :@Conditional修饰类型信息
*/
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

String systemName = context.getEnvironment().getProperty("os.name");
if(systemName.contains("Windows")){
return true;
}
return false;
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.kkb.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Conditional;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;

import com.kkb.beans.Student;
import com.kkb.beans.Teacher;
import com.kkb.util.LinuxCondition;
import com.kkb.util.WindowsCondition;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;

@Configuration//相当于配置文件
public class ApplicationConfig {

@Conditional({LinuxCondition.class})
@Bean
public Teacher teacher(){
return new Teacher();
}
@Conditional({WindowsCondition.class})
@Bean
public Student student(){
return new Student();
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
7.FactoryBean接口
package com.kkb.util;
import org.springframework.beans.factory.FactoryBean;
import com.kkb.beans.Student;
public class MyFactoryBean implements FactoryBean<Student> {
//通知Spring容器,当前Student类的实例对象创建方式
public Student getObject() throws Exception {
// TODO Auto-generated method stub
return new Student();
}
//通知Spring容器,被管理的bean对象在spring容易对应的类型
public Class<?> getObjectType() {
// TODO Auto-generated method stub
return Student.class;
}
/*
* true 单例
* false prototype
*
* */
public boolean isSingleton(http://www.my516.com) {
// TODO Auto-generated method stub
return true;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
8.@ Component @Controller @Service @Repository
注解扫描是识别这些注解,并将注解修饰的类交给spring容器管理

9.@Value @Autowired @Resource @Inject
@Value(注入基本类型和String类型)

@Autowired(byType–class类型) --spring提供的注解。byName需要配合@Qualifier注解使用
@Resource 默认先byName[bean的id或者name,再byType],建议使用,它是由java提供的注解
@Inject(默认是byType) byName是需要配合@Name使用
---------------------

基于纯注解的spring开发的介绍的更多相关文章

  1. 阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制

    新建项目 把之前项目src下的内容全部复制过来 pom.xml内复制过来 开始配置 新建一个config的包,然后再新建配置文件类SpringConfiguration @Configuration这 ...

  2. Spring Aop(二)——基于Aspectj注解的Spring Aop简单实现

    转发地址:https://www.iteye.com/blog/elim-2394762 2 基于Aspectj注解的Spring Aop简单实现 Spring Aop是基于Aop框架Aspectj实 ...

  3. Spring基于纯注解方式的使用

    经过上篇xml与注解混合方式,对注解有了简单额了解,上篇的配置方式极大地简化了xml中配置,但仍有部分配置在xml中进行,接下来我们就通过注解的方式将xml中的配置用注解的方式实现,并最终去掉xml配 ...

  4. springboot整合mybatis-plus基于纯注解实现一对一(一对多)查询

    因为目前所用mybatis-plus版本为3.1.1,感觉是个半成品,所有在实体类上的注解只能支持单表,没有一对一和一对多关系映射,且该功能还在开发中,相信mybatis-plus开发团队在不久的将来 ...

  5. 基于@Scheduled注解的Spring定时任务

    1.创建spring-task.xml 在xml文件中加入命名空间 <beans xmlns="http://www.springframework.org/schema/beans& ...

  6. 基于Aspectj 注解实现 spring AOP

    AOP 面向切面编程,是 OOP (面向对象编程)的补充 术语 横切关注点:方法中非主要业务逻辑部分 比如运算的模块:有验证参数.执行方法前的操作.执行方法.执行方法后的操作,验证参数.执行方法前后的 ...

  7. SpringMVC整合mybatis基于纯注解配置

    Mybatis整合Spring配置 第一部分:配置Spring框架 配置SpringMVC的步骤 配置流程图 导入包(哪些包,基本包5个,1日志依赖包,2webmvc支持包)SpringMVC配置 & ...

  8. Spring声明式事务管理基于@Transactional注解

    概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解.         第一种方式我已在上文为大 ...

  9. Spring 基于注解零配置开发

    本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:< Spring 基于注解零配置开发 > 一:搜索Bean 再也不用在XML文件里写什么配置信息了. Sprin ...

随机推荐

  1. Java中的Cloneable接口与深拷贝、浅拷贝

    Cloneable接口是一个标记接口,也就是没有任何内容,定义如下: 这里分析一下这个接口的用法,clone方法是在Object种定义的,而且是protected型的,只有实现了这个接口,才可以在该类 ...

  2. iOS 中的 Block

    参考:链接 (1)block作为本地变量(local variable) returnType (^blockName)(parameterTypes) = ^returnType(parameter ...

  3. VS2008 MFC截取整个屏幕并保存为jpg格式

    void CMainFrame::OnSavejpg() { // TODO: 在此添加命令处理程序代码 HWND hwnd = this->GetSafeHwnd(); //得到窗口句柄 HD ...

  4. bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1122  Solved: 80 ...

  5. Luogu P1373 小a和uim之大逃离【dp】By cellur925

    题目传送门 $50pts$:容易设计出状态$f[i][j][l][r][st]$表示当前的这个人在($i$,$j$),小a和uim魔瓶中的含量分别为$l$,$r$,当$st=0$表明现在是小a在吃,当 ...

  6. WOW.js 动画使用

    有的页面在向下滚动的时候,有些元素会产生细小的动画效果.虽然动画比较小,但却能吸引你的注意.比如刚刚发布的 iPhone 6 的页面(查看).如果你希望你的页面也更加有趣,那么你可以试试 WOW.js ...

  7. 洛谷 P3455 [POI2007]ZAP-Queries || 洛谷P2522,bzoj2301

    https://www.luogu.org/problemnew/show/P3455 就是https://www.cnblogs.com/hehe54321/p/9315244.html里面的方法2 ...

  8. 多个版本数据库在在一台数据库上lib 的切换问题。

    lib 的切换问题. 现象: /home/dbmon  >sqlplus / as sysdba/usr/lib/hpux64/dld.so: Unsatisfied data symbol ' ...

  9. OkHttp下载文件中途断网报Can't create handler inside thread that has not called Looper.prepare()异常的解决办法

    最近做项目时出现个问题. 在一个基类中,创建一个Handler对象用于主线程向子线程发送数据,代码如下: this.mThirdHandler = new Handler(){ @Override p ...

  10. Dapper系列之二:Dapper的事务查询

    Dapepr讲解 上篇文章我们介绍了,什么是Dapepr,有什么好处,性能的对比,还有多表多数据添加操作(事务的封装)等等.本篇文章我们继续讲解.....如果本篇文章看不懂,请看我上一篇文章:Dape ...