-
添加依赖
org.springframework spring-context 5.2.17.RELEASE junit junit 4.13.2 -
添加spring配置文件
-
配置文件
-
测试代码
@Test public void fun1(){ //1.容器初始化,解析 applicationContext.xml 配置文件,此时构造方法就会被调用 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); User user1 = (User) ac.getBean("user1"); User user2 = (User) ac.getBean("user2"); user1.say(); System.out.println(user1); System.out.println(user2); }
- 根据id获取
- 根据name获取
- 根据类型获取
-
id和name的区别
-
根据类型获取的缺点
根据类型获取的对象,如果容器中有两个对象,则会报错
-
测试代码
@Test public void fun1(){ User user1 = (User) ac.getBean("u1"); //根据name User user2 = (User) ac.getBean("user2"); //根据id User user3 = (User) ac.getBean(User.class); //根据类型,如果bean中的类不唯一,会报错 User user4 = ac.getBean("u1",User.class); //根据组合条件查询 }
-
工厂类
public class StaticFactoryDemo { public static User getInstance(){ return new User(); } } -
配置文件
-
测试类
@Test public void fun3(){ //1.容器初始化,解析 applicationContext.xml 配置文件,此时构造方法就会被调用 ac = new ClassPathXmlApplicationContext("applicationContext-staticfactory.xml"); User user1 = (User) ac.getBean("user"); user1.say(); }
-
工厂类
public class DynamicFactoryDemo { public User getInstance(){ return new User(); } } -
配置文件
-
测试类
@Test public void fun4(){ //1.容器初始化,解析 applicationContext.xml 配置文件,此时构造方法就会被调用 ac = new ClassPathXmlApplicationContext("applicationContext-staticfactory.xml"); User user1 = (User) ac.getBean("user"); user1.say(); }
属性注入,主要指如何给对象中的属性赋值
3.1 构造注入前提是对象需要有相关的构造方法
-
pojo对象
//提供构造方法.... public User(Integer age, Integer id) { this.age = age; this.id = id; } public User(String name, Integer age, Integer id) { this.name = name; this.age = age; this.id = id; } -
配置文件
前提是对象需要有相关的setter方法
-
pojo对象
private String name; private Integer age; private Integer id; //省略getter 和 setter
-
xml
-
实体类
private Cat cat; private String [] hobbies; private List
cats; private Map maps; private Properties pops; -
对象注入
-
数组注入
篮球 爬山 逛街 -
集合注入
-
Map注入
-
properties注入
root 123
-
配置类
import com.spring.pojo.User; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JavaConfig { @Bean(name = "user")//自定义name,可以通过ac.getBean(),获得对象 //@Bean(name = {"user","user1"}) //@Bean({"user","user1"}) public User getUser(){ User user = new User(); user.setName("abaaba"); return user; } } -
实现类
@Test public void fun1(){ //1.容器初始化,加载配置类 ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class); User user1 = ac.getBean(User.class); User user2 = (User)ac.getBean("user"); User user3 = (User)ac.getBean("bbbb"); System.out.println(user1); System.out.println(user2); System.out.println(user3); }
-
controller
public class UserController { //因为要使用service对象,所以需要属性注入,这里使用设值注入 private IUserService service; public Listquery(){ return service.query(); } public IUserService getService() { return service; } public void setService(IUserService service) { this.service = service; } } -
service
public interface IUserService { public Listquery(); } public class UserServiceImpl implements IUserService { //因为要使用dao对象,所以需要属性注入,这里使用设值注入 private IUserDao dao; public Listquery() { return dao.query(); } public IUserDao getDao() { return dao; } public void setDao(IUserDao dao) { this.dao = dao; } } -
dao
public interface IUserDao { public Listquery(); } public class UserDaoImpl implements IUserDao { public Listquery() { //假设从数据库获取的内容 List users = new ArrayList (); users.add(new User(1,"1111")); users.add(new User(2,"2222")); users.add(new User(3,"3333")); return users; } }
-
xml配置文件
-
测试代码
@Test public void fun1(){ //1.容器初始化,加载配置类 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-xml.xml"); UserController controller = (UserController)ac.getBean("userController"); System.out.println(controller.query()); }
-
javaconfig
import com.spring.controller.UserController; import com.spring.dao.IUserDao; import com.spring.dao.impl.UserDaoImpl; import com.spring.service.IUserService; import com.spring.service.impl.UserServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JavaConfig { @Bean public UserController userController(IUserService iUserService){ UserController controller = new UserController(); controller.setService(iUserService); return controller; } @Bean public IUserService userService(IUserDao iUserDao){ IUserService service = new UserServiceImpl(); ((UserServiceImpl) service).setDao(iUserDao); return service; } @Bean public IUserDao userDao(){ return new UserDaoImpl(); } } -
测试类
@Test public void fun1(){ //1.容器初始化,加载配置类 ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class); UserController controller = ac.getBean(UserController.class); System.out.println(controller.query()); }
-
controller
@Controller public class UserController { @Autowired private IUserService service; public Listquery(){ return service.query(); } } -
service
@Service public class UserServiceImpl implements IUserService { @Autowired private IUserDao dao; public Listquery() { return dao.query(); } } -
dao
@Repository public class UserDaoImpl implements IUserDao { public Listquery() { List users = new ArrayList (); users.add(new User(1,"1111")); users.add(new User(2,"2222")); users.add(new User(3,"3333")); return users; } } -
applicationContext.xml
-
测试类
@Test public void fun1(){ //1.容器初始化,加载配置类 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-xml.xml"); UserController controller = (UserController)ac.getBean("userController"); System.out.println(controller.query()); }
-
controller
@Controller public class UserController { @Resource(type =IUserService.class,name = "userServiceImpl") //name对象是接口的实现类,不是接口 private IUserService service; public Listquery(){ return service.query(); } } -
service
@Service public class UserServiceImpl implements IUserService { @Autowired //自动装配 @Qualifier("dao") //当有多个bean对象的时候,指定唯一名称进行查找 private IUserDao dao; public Listquery() { return dao.query(); } } -
dao
@Repository public class UserDaoImpl implements IUserDao { public Listquery() { List users = new ArrayList (); users.add(new User(1,"1111")); users.add(new User(2,"2222")); users.add(new User(3,"3333")); return users } } -
Java配置类
@Configuration //@ComponentScan(useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(Controller.class)}) //单个扫描路径,不配置内容表示扫描全部路径 //includeFilters = {@ComponentScan.Filter(Controller.class)}中使用的是注解的类,比如Controller.class, //@ComponentScan(basePackageClasses = {UserDaoImpl.class,UserServiceImpl.class},useDefaultFilters = true,excludeFilters = {@ComponentScan.Filter(Controller.class)})}) @ComponentScans({@ComponentScan(basePackages = "com.spring", useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(Controller.class)}), @ComponentScan(basePackageClasses = {UserDaoImpl.class,UserServiceImpl.class},useDefaultFilters = true,excludeFilters = {@ComponentScan.Filter(Controller.class)})}) //配置多个扫描路径 public class JavaConfig { } -
测试代码
@Test public void fun1(){ //1.容器初始化,加载配置类 ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class); UserController controller = ac.getBean(UserController.class); System.out.println(controller.query()); }
-
@Component
泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
-
@Controller
用于标注控制层组件
-
@Service
用于标注业务层组件
-
@Repository
用于标注数据访问组件,即DAO组件
- @Autowired
@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。
@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
-
@Qualifier
如果容器中有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称,一般情况下和@Autowired一起使用
-
@Resource
默认使用类型查找对象,但是提供name用于根据名称查找,等同于@Qualifier,提供type用于根据类型查找,等同于 @Autowired
-
@Primary
自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
为属性动态设值
@Component
public class UserBean {
@Value("王尼玛")//注入普通字符串
private String userName;
@Value("#{systemProperties['os.name']}")//注入系统信息
private String systemPropertiesName;
@Value("#{T(java.lang.Math).random()*100}")//注入表达式结果
private double randomNumber;
@Value("#{cat.nick}")//注入其他bean的属性
private String fromCatName;
@Value("calsspath:applicationContext-xml.xml")//注入文件
private Resource resourceFile;
@Value("http://baidu.com")
private Resource image;
...
//省略getter、setter、toString
}
4.3.4 @PropertySource
读取第三方文件中的信息
-
配置类
@Configuration //@ComponentScan(useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(Controller.class)}) //单个扫描路径,不配置内容表示扫描全部路径 //includeFilters = {@ComponentScan.Filter(Controller.class)}中使用的是注解的类,比如Controller.class, //@ComponentScan(basePackageClasses = {UserDaoImpl.class,UserServiceImpl.class},useDefaultFilters = true,excludeFilters = {@ComponentScan.Filter(Controller.class)})}) @ComponentScans({@ComponentScan(basePackages = "com.spring", useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(Controller.class)}), @ComponentScan(basePackageClasses = {UserDaoImpl.class,UserServiceImpl.class},useDefaultFilters = true,excludeFilters = {@ComponentScan.Filter(Controller.class)}), @ComponentScan(basePackages = "com.spring.pojo")}) //配置多个扫描路径 @PropertySource("classpath:jdbc.properties") //指定加载的属性文件 public class JavaConfig { } -
bean对象
@Value("${JDBC_DRIVER}") private String DriverManager; @Value("${JDBC_URL}") private String jdbcUrl;在获得数据的时候,可以使用@Value注解获得数据
表示延迟初始化
@Test
public void fun1(){
//1.容器初始化,加载配置类
ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class);
//在执行配置文件读取的时候,就会初始化对象
System.out.println("IOC初始化完成了");
Cat cat = ac.getBean("cat",Cat.class);
}
-
不加@Lazy注解
Cat初始化
IOC初始化完成了
-
加@Lazy注解
IOC初始化完成了
Cat初始化 -
特殊情况
延迟加载的类,在其他类中被使用,延迟加载失效
-
@PostConstruct
系统初始化之后执行的方法
@PostConstruct public void init(){ System.out.println("系统初始化方法"); } -
@PreDestroy
系统销毁之后执行的方法
@PreDestroy public void destroy(){ System.out.println("系统被销毁了"); } -
@DependsOn
更改初始化顺序
不加@DependsOn注解时候,初始化顺序随机
系统初始化方法
Cat初始化
User初始化在cat类上添加@DependsOn注解,使其依赖于user,指定user在cat类之前初始化
@Component @DependsOn("user") public class Cat { }系统初始化方法
User初始化
Cat初始化



