1、声明bean的注解
@Component
@Controller
@Service
@Repository
@Controller@Service@Repository这三个注解都是@Component理论来说这几个注解随便用哪一个都可以,但是为了开发方便我们一般在控制器上会使用@Controller
service类上会用@Service
dao类会用@Repository
他们都可以通过value来指定id及对应xml文件里面bean里面的id
注意
我们在使用上面注解的时候要在pom里面引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>6.0.0</version>
</dependency>
<!--spring context依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.14</version>
</dependency>
再spring.xml里面配置context命名空间
<context:component-scan base-package="com.bac.jing"/>
让它扫描这个包下所有的bean注解
测试
package com.bac.jing;
import org.springframework.stereotype.Service;
@Service
public class B{
public B() {
System.out.println("b的构造方法执行");
}
public void bca(){
System.out.println("b的bca执行了");
}
}
@Test
public void test4(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
B b = context.getBean("b", B.class);
System.out.println(b);
}
可以看到我们这样就不用写xml配置文件了。
2、负责注入的注解
@Value
Value注解可以初始化我们的属性值如
package com.bac.jing;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class User {
@Value("雷谋")
private String name;
@Value("20")
private int age;
@Value("女")
private String address;
public User(String address, int age, String name) {
this.address = address;
this.age = age;
this.name = name;
}
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
@Test
public void test5(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
User user = context.getBean("user", User.class);
System.out.println(user);
}
可以看到我们的Value里面的值被注入了
选择我们试一下把set方法和构造方法删了看一下测试可不可以运行
好了我们发现这样也可以把值注入
@Autowired
可以出现在
构造方法上形参上
set方法上
属性上
注解上
我们先来测试属性上
创建一个接口一个实现类
package com.bac.jing;
public interface User2 {
void say();
}
package com.bac.jing;
import org.springframework.stereotype.Service;
@Service
public class User2iml implements User2{
@Override
public void say() {
System.out.println("User2iml正在执行");
}
}
我们再写一个类然后看一下能不能把User2注入
package com.bac.jing;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class User2s {
@Autowired
private User2 user2;
public User2s(User2 user2) {
this.user2 = user2;
}
public User2s() {
}
public User2 getUser2() {
return user2;
}
public void setUser2(User2 user2) {
this.user2 = user2;
}
}
测试
@Test
public void test6(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
User2s user2s = context.getBean("user2s", User2s.class);
user2s.getUser2().say();
}
可以看到我们的User2已经被注入了
那我们试一下没有构造方法和set方法看一下可不可以被注入
可以看到我们把set和构造方法去掉也可以注入
构造方法上
可以看到构造方法上也可以运行
我们也可以这样写
哦豁报错了,那么我们把无参构造方法去掉
好这下可以了
他还有一个写法当只有一个构造方法的时候可以直接不写注解
set方法上
@Qualifier
我们直接写@Autowired注解是直接通过类型赋值,当有User2有两个实现类的时候就要通过这个来写id
@Resource
这个注解就是在只有一个类型的时候就根据类型注入,没有就根据名字注入