Spring注解的方式实现对象的管控
注解作用与XML形式的作用是一样的,用于对象创建的注解<bean id="" class="">
@Component(value="id")
value可以省略 @Component("id"),小括号都可以省略@Component,如果value不写,id默认为类名字的驼峰式
@Component("studentController")
public class StudentController {
//属性 业务层小弟
@Autowired
private StudentService service;
public StudentService getService() {
return service;
}
//自己控制方法
public void contollerMethod(String ssex){
System.out.println("controllerMethod");
service.serviceMethod(ssex);
}
}
@RestController
@RestController = @Controller + @ResponseBody 组成
它的作用简短的说就是指该类中所有的API接口返回的数据,不管你对应的方法返回值是Map或是其他Object,它都会以Json字符串的形式返回给客户端
@RestController
@RequestMapping("test")
public class SampleController {
@GetMapping //以get方式发起的请求
public Map testGet() {
HashMap<String, String> map = new HashMap<String, String>()
map.put("name", "springboot");
return map;
}
@GetMapping(path = "str")
public String testGetStr() {
return "OK";
}
}
@Controller
@Controller("studentController")
public class StudentController {
//属性 业务层小弟
@Autowired
private StudentService service;
public StudentService getService() {
return service;
}
//自己控制方法
public void contollerMethod(String ssex){
System.out.println("controllerMethod");
service.serviceMethod(ssex);
}
}
@Service
@Service("studentService")
public class StudentService {
//属性 DAO小弟
private StudentDao dao;
@Autowired
public void setDao(StudentDao dao) {
this.dao = dao;
}
//自己业务方法
public void serviceMethod(String ssex){
System.out.println("serviceMethod");
dao.select(ssex);
}
}
@Repository
@Repository("studentDao")
public class StudentDao {
//属性 小弟JdbcTemplate SqlSession
@Autowired
private JdbcTemplate jdbcTemplate;
//dao自己的方法
public void select(String ssex){
System.out.println("daoMethod");
String sql = "select * from student where ssex = ?";
List list = jdbcTemplate.queryForList(sql,ssex);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
用于对象创建后的机制<bean id="" class="" scope="singleton" lazy-init="false" init-method destroy-method>
@Scope("singleton 单例 | prototype 多例")
@Lazy(true) 懒加载 默认为true
@PostConstructor 在创建对象之后就执行的方法,写在方法上面
@PostConstructor
public void init() {
System.out.println("init");
}
@PreDestroy 在关闭spring容器(BeanFactory .close()
)对象被回收执行的方法,写在方法上面
@PreDestroy
public void destroy() {
System.out.println("destroy");
}
对象中可能含有属性
属性的自动注入DI
@Autowired
属性上面 属性对应的set方法上面 带有参数的构造方法上面
@Qualifier
属性对象注入的微调整 属性有多个对象对应 选择其中一个
@Component
public class Impl1 implements TestInterface{
}
@Component
public class Impl2 implements TestInterface{
}
@Autowired
@Qualifier("impl2")
private TestInterface testInterface;
@Value("值")
还支持SpEL @Value("${值}")
@Value("1")
private Integer sid;
@Value("zzt")
private String sname;
@Value("男")
private String ssex;
@Value("18")
private Integer sage;
@Resource(name="") import javax.Resource;
一个@Resource(name="") 等价于 @Autowired+@Qualifier 俩个注解
不是Spring家族提供的注解 ,Java提供的 ,从统一性来讲不好。
@Autowired
@Qualifier("impl2")
private TestInterface testInterface;
与下面效果相同
@Resource(name="impl2")
private TestInterface testInterface;
jdbc.properties ------位于src目录下
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/newtest?useSSL=false&characterEncoding=UTF-8
user=root
password=123456
@Configuration
告知Spring这个类是我的配置 需要让他干活
@ComponentScan(basePackages={"configclass","controller","service","dao","domain"})
告知Spring需要扫描其他包,等价于ApplicationContext.xml文件中<context:component-scan base-package="controller,service,dao,domain"></context:component-scan>
,扫描有注解的包
@Import(ConfigClass.class)
如果主配置中方法过多,主配置类拆开,变成多个小配置类,主配置类中通过@Import(小配置类.class)进行引入
MainConfig ----主配置类
/**
* 主配置
*/
@Configuration //告知Spring这个类是我的配置 需要让他干活
@ComponentScan(basePackages={"configclass","controller","service","dao","domain"})
@Import(ConfigClass.class)
public class MainConfig {
}
@PropertySource("classpath:jdbc.properties")
告诉这个类去读取src目录下的jdbc.properties
文件
@Value("${driverClassName}")
使用外部配置文件的方式引入,读取src目录下的jdbc.properties
文件的driverClassName=com.mysql.jdbc.Driver
@Bean
如果bean注解中不写id,方法名字即使默认对象的id
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}
ConfigClass --------------小配置类
/**
* 小配置类
* 这个类的目的是用来替代原有spring核心文件背后的目的
* 原来:核心文件---加载文件中的类名字---反射创建对象
* 现在:通过这个自定义类 创建对象
* 通过这个类中自定义方法 实现创建对象
*/
@PropertySource("classpath:jdbc.properties")
public class ConfigClass {
@Value("${driverClassName}")
private String driverClassName;
@Value("${url}")
private String url;
@Value("${user}") //这里不能用username,spring底层也有个配置文件名字为username,读取不到自定义properties文件中的username值
private String user;
@Value("${password}")
private String password;
//定义一个方法 目的是获取一个对象 JdbcTemplate类型
// 肯定有返回值
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}
//再定义一个方法 目的是获取一个DataSource类型的对象
@Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
System.out.println(driverClassName);
System.out.println(url);
System.out.println(user);
System.out.println(password);
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
}
通过注解的方式读取配置信息
public class TestMain {
public static void main(String[] args) {
//通过扫描注解的方式获取一个工厂对象 改变创建工厂的类
BeanFactory factory = new AnnotationConfigApplicationContext(MainConfig.class);
StudentController controller = (StudentController) factory.getBean("studentController");
controller.contollerMethod("男");
}
}
通过方法创建对象
这里通过createUser方法来创建User对象 对象名为UserFac
public class UserFactory{
public static User createUser(){
return new User();
}
}
<bean id="userFac" class="com.video.spring.UserFactory" factory-method="createUser">
网友评论