注解开发
以前我们都是写配置文件.xml 来实现属性和对象的创建与注入
现在 我们用注解的形式 就能免去写.xml配置文件 这繁琐的事了
做法——创建个maven工程——引入spring依赖(spring context)创建一个配置类 来代替xml配置文件
比如 现在创建了一个包叫config
在包里创建了一个类 叫Config
在Config类的上面加上注解
@Configuration //告诉Spring 这是一个配置类
再加上注解
@ComponentScan(value = “com.mumu”)
表示扫描com.mumu 下的所有包
//配置类 == 配置文件
@Configuration //告诉Spring 这是一个配置类
@ComponentScan(value = "com.mumu")
public class Config {
@Bean//给容器中注册一个Bean;这个方法 的意思就是 给这个容器返回一个对象
public Mybean mybean(){
return new Mybean();
}
}
@Bean//给容器中注册一个Bean;这个方法 的意思就是 给这个容器返回一个对象
问:既然@ComponentScan(value = “com.mumu”)是扫描这个目录下的所有包 那我有写包不想被你扫 又刚好在这个目录下呢?
答:在@ComponentScan(value = “com.mumu”,形参)补形参 用到的时候百度一下看看怎么用
//配置类 == 配置文件
@Configuration //告诉Spring 这是一个配置类
@ComponentScans(value = @ComponentScan(value = "com.mumu",excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Service.class)
//这个注解的意思是 我会扫描com.mumu这个包 但是 我会排除@Service这个注解下的东西
//excludeFilters 排除
//FilterType.ANNOTATION 根据类型 去筛选
}))
public class Config {
@Bean//给容器中注册一个Bean;这个方法 的意思就是 给这个容器返回一个对象
public Mybean mybean(){
return new Mybean();
}
}
来介绍@Scope注解
介绍之前 要先来了解一下它里面的属性 单实例(singleton)和多实例(prototype)
singleton: 单实例的意思就 当 IOC容器启动的时候就会调用方法创建对象,以后每次获取都是从容器当中拿同一个对象(map当中)
prototype:多实例的意思 就是当,IOC容器启动创建的时候,并不会创建对象放在容器在容器当中,当你需要的时候,需要从容器当中取该对象的时候,就会创建。
问:@Scope注解 有什么用?
答:@Scope注解的目的是用来调节作用域的
来介绍@Conditional注解
这个注解的意思就是按条件来注册bean
怎么来理解呢?
打个比方 比如我们要根据用户的操作系统来注册bean
提供两个类 一个是windows系统 就会return true
另一个类 要是系统是linux 则返回true
在配置类中 在@bean注解上加上@Conditional ( { 类.class } )
根据类的条件 去注册bean 如果是true 就注册 是fale就不注册
@Conditional注解也可以放在类上
来谈谈@Inmport注解,它是给容器导入组件的。
比如我有个组件(一个类) Color 类
有另外一个类需要用这个组件 我就可以利用这个注解来导入
做法
在需要这个组件的类上面田间这个注解
@Import (Color.class)
bean的生命周期
单实例:在容器启动的时候创建对象
多实例:在容器要用的时候,再来获取对象
单实例: 容器启动——>创建对象——>bean初始化(有个initMethed在它初始化的时候会被调用)——>关闭容器——>bean销毁
多实例: 容器启动不会创建对象,在需要时才会创建——>关闭容器——>bean销毁(有个destroyMethod在它销毁的时候会被调用)
如果有两个方法 A(),B()
需要在bean初始化 时 和销毁时分别执行 则这样写
@bean(initMethed=“A”,destroyMethod=“B”)
还可以通过创建一个类 让类去实现两个接口 重写两个方法
InitializingBean接口 : bean初始化时执行这个里面的方法
DisposableBean接口 :bean销毁时执行这个里面的方法
来谈谈@Value注解
这个注解 是给属性赋值的
例如
@Value( “张三”)
String name;
这样就给属性赋值了
也可以写表达式 # { 表达式 }
@Value("#{ 20-10 }")
int age
表示这个年龄为20-10岁 也就是10岁
如果要读取赋值配置文件里的内容 那么就用
@Value("
配
置
文
件
里
面
属
性
的
名
称
"
)
我
们
做
的
在
线
教
育
项
目
o
s
s
阿
里
云
的
配
置
信
息
就
是
用
这
个
方
式
获
取
到
的
/
/
读
取
a
p
p
l
i
c
a
t
i
o
n
.
p
r
o
p
e
r
t
i
e
s
文
件
中
阿
里
云
o
s
s
中
的
配
置
文
件
内
容
@
V
a
l
u
e
(
"
{配置文件里面属性的名称}") 我们做的在线教育项目oss阿里云的配置信息就是用这个方式获取到的 //读取application.properties文件中 阿里云oss中的配置文件内容 @Value("
配置文件里面属性的名称")我们做的在线教育项目oss阿里云的配置信息就是用这个方式获取到的//读取application.properties文件中阿里云oss中的配置文件内容@Value("{aliyun.oss.file.endpoint}")
String endpoint;
给类这中的的属性注入对象
那么只需要在属性上方添加
@Autowired 根据属性类型进行自动装配
@Qualifier 根据属性名称进行注入
@Resource 可以根据类型注入 可以根据名称注入
这三个中的合适的属性 就可以将它的对象 注入到 当前类的属性中,(注意:另外一个类的类上方也要写 创建对象的注解
问:哪些是创建对象的注解?
答:
在类的上面 添加
1、@Component
2、@Service
3、@Controller
4、@Repository
意思是将类交给spring管理
)
如果无法从类型(@Autowired )方式注入 属性 (因为有相同类型的) 那么可以通过用@Autowired + @Qualifier 类型加名称的方式注入
@RequestParam 接收普通参数
@RequestPart 接收复杂类型的参数 比如文件JSON,XML等
public String upload(@RequestParam("email") String email,
@RequestParam("username") String username,
@RequestPart("headimg") MultipartFile headimg,
@RequestPart("phoneimg") MultipartFile[] phoneimg) throws Exception{
@RequestMapping 请求路径映射,如果标注在某个controller的类级别上,则表明访问此类路径下的方法都要加上其配置的路径;最常用是标注在方法上,表明哪个具体的方法来接受处理某次请求。
“@RequestMapping"的value值前后是否有“/”对请求的路径没有影响,即value=“book” 、”/book"、"/book/"其效果是一样的。
@PathVariable 注解提取路径中的变量()
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue")
public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
// implementation omitted
}
@ResponseBody的作用其实是将java对象转为json格式的数据。@ResponseBody是作用在方法上的