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执行了");}
}
@Testpublic 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;}
}
@Testpublic 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{@Overridepublic 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 {@Autowiredprivate User2 user2;public User2s(User2 user2) {this.user2 = user2;}public User2s() {}public User2 getUser2() {return user2;}public void setUser2(User2 user2) {this.user2 = user2;}
}
测试
@Testpublic 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
这个注解就是在只有一个类型的时候就根据类型注入,没有就根据名字注入